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中,来实现数据传递。