Flutter:从另一个返回时更新屏幕

Flutter: update screen when coming back from another

我已经阅读了关于该主题的其他答案,但我有点困惑。

我有这种很常见的情况,ScreenA 触发导航到 ScreenBScreenB 执行它的操作,然后用户点击后退按钮,我们 return至 ScreenA。此时,我想 运行 一些代码,但我不知道该怎么做。

这是我导航到 ScreenB 的代码:

Navigator.pushNamed(context, Router.ScreenB)

领航员:

class Router {
  static const ScreenB = "/b";

  static Route<dynamic> generateRoute(RouteSettings routeSettings) {
    switch (routeSettings.name) {
      case ScreenB :
        return MaterialPageRoute(builder: (_) => ScreenB());
      default:
        return MaterialPageRoute(builder: (_) {
          return Scaffold(
            body: Center(
              child: Text('No route defined for ${routeSettings.name}'),
            ),
          );
        });
    }
  }
}

我试过

Navigator.pushNamed(context, Router.ScreenB)
.then((value) {
   //do stuff
});

但是 then() 从未被调用,即使我添加

Navigator.pop(context);

ScreenB

我在这里错过了什么?

这是一个工作示例:

import 'package:flutter/material.dart';
import 'package:pop_test/router.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      onGenerateRoute: Router.generateRoute,
      home: ScreenA(),
    );
  }
}

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

class Router {
  static const Screen_B = "/b";

  static Route<dynamic> generateRoute(RouteSettings routeSettings) {
    switch (routeSettings.name) {
      case Screen_B:
        return MaterialPageRoute(builder: (_) => ScreenB());
      default:
        return MaterialPageRoute(builder: (_) {
          return Scaffold(
            body: Center(
              child: Text('No route defined for ${routeSettings.name}'),
            ),
          );
        });
    }
  }
}

class ScreenA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Screen A"),
      ),
      body: Center(
        child: FlatButton(
          onPressed: () {
            Navigator.of(context).pushNamed(Router.Screen_B).then((value) {
              print("do stuff");
            });
          },
          child: Text("Push screen B"),
        ),
      ),
    );
  }
}

class ScreenB extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Screen B"),
      ),
      body: Center(
        child: FlatButton(
          onPressed: () {
            Navigator.of(context).pop();
          },
          child: Text("Pop"),
        ),
      ),
    );
  }
}

我应该提到我已经重命名 Router.ScreenB 常量,因为名称与屏幕 class 冲突(也许这是你的问题?)。除此以外,我认为,没有进行其他更改。此外,通常,最好使用 async/await 而不是 Future.then

顺便说一下,您已经写过当用户点击返回时您需要做一些事情。如果您在这里指的是系统按钮,那么您应该使用 WillPopScope 小部件。我希望这会有所帮助。