参考
- https://api.flutter.dev/flutter/widgets/RouteObserver-class.html
- https://medium.com/@najeira/how-to-handle-screen-transitions-in-flutter-b39dcb2675f
- https://medium.com/flutter-community/how-to-track-screen-transitions-in-flutter-with-routeobserver-733984a90dea
概述
- 屏幕切换(screen transitions)或者说路由变化(push/pop)时,Flutter ‘s Widgets本身并没有回调函数会调用,因为像MaterialApp这么大量级的widget也仅仅是一个widget而已,它本身是不具备知晓路由变化的能力的。在纯flutter应用中(混合式中也可以),Navigator来管理页面路由,你可以给Navigator传递a list of NavigatorObserver来接收页面路由事件。你可以自己实现NavigatorObserver,或者说更方便一点,直接使用RouteObserver.
怎么用(入门教程)
- 在main函数上面定义一个这个东西:
// global RouteObserver
// 这里定义了一个routeObserver
// 但PageRoute是个什么东西?
// 怎么访问routeObserver?为什么在_ListPageState中可以直接访问到routeObserver?
// |_好像这里定义了,在任何一个地方都可以访问routeObserver,好像它是一个全局变量似的,甚至比全局变量还牛逼的一个东西routeObserver
final RouteObserver<PageRoute> routeObserver = new RouteObserver<PageRoute>();
void main() => runApp(MyApp());
-
把routeObserver这个东西传递给MaterialApp的navigatorObservers(其实最终给到了Navigator,MaterialApp widget只是包裹了Navigator):
-
最后进入到自己的widget中,添加如下代码:
注意
- 在纯flutter应用中,这样使用应该没啥问题
- 在native和纯flutter混合应用中,应为页面堆栈管理的复杂性、混乱性不一定那么好使,但在flutter切flutter页面时还是好使的,flutter切native就不一定好使了,因为跳转的时候,用的不是Navigator api,Navigator怎么给你发送通知啊?NavigatorObserver怎么收到通知啊?这样想想也对,结合native堆栈管理,应该就可以搞定这个事情了。