【问题标题】:Flutter: update screen when coming back from anotherFlutter:从另一个回来时更新屏幕
【发布时间】:2020-07-24 13:44:13
【问题描述】:

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

我有这种非常常见的情况,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

我在这里错过了什么?

【问题讨论】:

  • 您是否尝试将值从 ScreenB 传递回 ScreenA?
  • @DidierPeranGanthier 不,他们试图在弹出小部件后运行代码。
  • 所以如果你在.then 中添加一个print 语句,它就永远不会打印?这应该没什么区别,但是你试过await吗?
  • 正确,我不在乎返回值。基本上 ScreenA 包含一个列表, ScreenB 允许您编辑列表项,所以当您从 ScreenB 返回时,我想显示更新的项目。 @ChristopherMoore,它不打印任何东西。你会把等待放在哪里?我之前尝试过 Navigator.pushNamed() 无济于事
  • 是的,这就是放置await 的地方。你在哪里添加Navigator.pop

标签: flutter dart navigation


【解决方案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 小部件。我希望这会有所帮助。

【讨论】:

  • 是的,ScreenA 和 ScreenB 是我为这个问题编造的虚构名称。出于某种原因更改为 Navigator.of(context) 工作
猜你喜欢
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2020-09-03
  • 2019-10-27
  • 2021-01-06
相关资源
最近更新 更多