Administrator
Administrator
Published on 2025-06-09 / 7 Visits
0
0

页面中监听路由事件

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
  }
}


Comment