颤振:从另一个屏幕回来时更新屏幕

时间:2020-07-24 13:44:13

标签: flutter dart navigation

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

我有一个非常常见的情况,ScreenA触发导航到ScreenBScreenB完成其工作,然后用户点击“后退”按钮,我们返回到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

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

这是一个可行的示例:

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常量(也许这是您的问题吗?)。我认为,除此以外,没有其他更改。另外,通常最好使用async/await而不是Future.then

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