Flutter组件补充

269 阅读2分钟

WillPopScope(导航返回拦截)

const WillPopScope({
  ...
  @required WillPopCallback onWillPop,
  @required Widget child
})

onWillPop是一个回调函数,当用户点击返回按钮时调用(包括导航返回按钮及Android物理返回按钮),该回调需要返回一个Future对象,如果返回的Future最终值为false时,则当前路由不出栈(不会返回),最终值为true时,当前路由出栈退出。我们需要提供这个回调来决定是否退出。 数据传递的两种方式

沿着Widget树的方向,从上往下传递数据及状态

InheritedWidget

const WillPopScope({
  ...
  @required WillPopCallback onWillPop,
  @required Widget child
})

MediaQuery(MediaQuery是BuildContext中的属性)

MediaQuery存储在的BuildContext中的位置是在WidgetsApp(因为其实MaterialApp返回的也是它)

  • MediaQuery状态保存的原理
    • 继承InheritedWidget
    • 通过build方法中返回
    • 通过context.inheritFromWidgetOfExactType来获取 ValueNotifier(继承至ChangeNotifier)

可以注册监听事件。当值发生改变时,会给监听则发送监听

// 注册监听
ValueNotifier<bool> canListenLoading = ValueNotifier(false);
@override void didChangeDependencies() { super.didChangeDependencies();  
    // 在这里添加监听事件 
    appState.canListenLoading.addListener(listener); 
} }

@override void dispose() { 
    // 在这里移除监听事件 
    appState.canListenLoading.removeListener(listener); super.dispose(); 
}

@override void initState() { 
    // 初始化监听的回调
    listener = () { }; 
}; 
super.initState(); 
}
  • Key保存Widget的状态,我们可以通过给对应Widget的key,来保存状态,并通过Key来拿到状态。比如是 ObjectKey可以在列表中标记唯一的Key,来保存状态,让动画识别。GlobalKey,则可以保存一个状态,其他地方都可以获取。
  • InheritedWidget可以持有一个状态,共它的子树来获取。这样子树本身可以不直接传入这个字段(这样可以避免多级的Widget时,要一层一层向下传递状态),还可以做不同Widget中间的状态同步
  • ChangeNofier继承这里类,我们就可以实现Flutter中的观察者模式,对属性变化做观察。 沿着Widget树的方向,从下往上传递数据及状态

Notification(通过NotificationListener的方式来监听)

我们可以通过Notification的继承类,将其发布到对应的buildContext中,来实现数据传递。