RouteObserver+混合RouteAware,监听从其它页面pop回到当前、当前页面通过pop关闭、push到其它页面、push打开到当前页面。
目前仅用到了didPopNext,当从其它页面返回时重新加载部分数据(刷新数据)
仅在StatefulWidget(有状态组件)中可以混入RouteAware!!
只能监听pop/push动作,tab之间的切换可以借助TabController的addEventListener,判断index。
根组件:
final RouteObserver<ModalRoute> routeObserver = RouteObserver<ModalRoute>();
void main() {
runApp(
const MyApp()
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorObservers: [routeObserver],
//....其它属性
);
}
}
任意被监听的组件:
class LoginPage extends StatefulWidget {
const LoginPage({super.key});
@override
State<LoginPage> createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> with RouteAware {
@override
void didChangeDependencies() {
super.didChangeDependencies();
routeObserver.subscribe(this, ModalRoute.of(context)!); //监听
}
@override
void didPopNext() {
print("从一个被push打开的页面,通过pop关闭后返回到了当前页面");
super.didPopNext();
}
@override
void didPush() {
print("当前页面被通过push打开,也就是新进入当前页面");
super.didPush();
}
@override
void didPop() {
print("当前页面通过pop离开(返回了上一层)");
super.didPop();
}
@override
void didPushNext() {
print("当前页面用Push打开了一个新页面(当前页面仍在栈中)");
super.didPushNext();
}
@override
void dispose() {
routeObserver.unsubscribe(this); //释放监听
super.dispose();
}
@override
Widget build(BuildContext context) {
return //widget
}
}