在 Flutter 中检测我们何时移回上一页

Dan*_*ani 6 dart flutter

我们从 Page1 移到了 Page2 但现在从 Page2 我们又回到了 Page1 像这样:

Navigator.of(context).pop();

我们如何在 Page1 上检测到我们返回了?

Jay*_*ara 17

Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => NextPage(),
    ),
  ).then((_){
// Here you will get callback after coming back from NextPage()
// Do your code here
});
Run Code Online (Sandbox Code Playgroud)

  • 简单又干净。谢谢! (2认同)

Cra*_*Cat 8

在你的Page1,当你按下时Page2等待它弹出

Future<void> _goToPage2() async {
  await Navigator.push(
    context,
    MaterialPageRoute(
      builder: (context) => Page2(),
    ),
  );
  print("Page2 is popped");
}
Run Code Online (Sandbox Code Playgroud)


FDu*_*hen 6

另一种解决方案是创建您自己的NavigatorObserver.

1-创建您的NavigatorObserver

final routeObserver = MyRouteObserver();

class MyRouteObserver extends NavigatorObserver {
  final Set<RouteAware> _listeners = <RouteAware>{};

  void subscribe(RouteAware routeAware) {
    _listeners.add(routeAware);
  }

  void unsubscribe(RouteAware routeAware) {
    _listeners.remove(routeAware);
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
    for (var listener in _listeners) {
      listener.didPop();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

2-将其添加到您的MaterialApp

  return MaterialApp(
      navigatorObservers: [routeObserver],
...
Run Code Online (Sandbox Code Playgroud)

RouteAware3-在您想要监听导航事件的小部件中实现,并订阅/取消订阅您的routeObserver

class _TablePageState extends State<TablePage> implements RouteAware {

  @override
  void initState() {
    super.initState();
    routeObserver.subscribe(this);
  }


  @override
  Widget build(BuildContext context) {
    return Container();
  }

  @override
  void dispose() {
    routeObserver.unsubscribe(this);
    super.dispose();
  }

  @override
  void didPop() {
    //This method will be called from your observer
  }

  @override
  void didPopNext() {}

  @override
  void didPush() {}

  @override
  void didPushNext() {}
}
Run Code Online (Sandbox Code Playgroud)