Flutter popUntil 出现“Bad state: Future already completed”错误

15

我的屏幕顺序是A->B->C->D

在B、C、D屏幕中有一个按钮,应该带你回到A屏幕,并保留它的状态(因此pushNamedAndRemoveUntil在这里不适用)

我想使用popUntil,下面是如何操作,基于文档:

Navigator.popUntil(context, ModalRoute.withName(ScreenName.mainScreen));
我遇到了一个错误: Bad state: Future already completed
这是我的主要内容:
void main() {
  SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);

  final pages = {
    ScreenName.mainScreen: (settings) => MaterialPageRoute(
        builder: (context) => MainScreen(), settings: settings),
  };

  var configureApp = AppConfig(
    appName: 'TaskerMate',
    flavorName: FLAVOR_NAME.PROD,
    child: AppModelProvider(
      model: AppModel(),
      child: MaterialApp(
        theme: TMTheme().get(),
        home: SplashScreen(),
        onGenerateRoute: (settings) {
          pages[settings.name](settings);
        },
        routes: {ScreenName.mainScreen: (context) => MainScreen()},
      ),
    ),
  );

  Logger.root.level = Level.ALL;
  Logger.root.onRecord.listen((LogRecord rec) {
    print('${rec.level.name}: ${rec.time}: ${rec.message}');
  });

  runApp(configureApp);
}

ScreenName.mainScreen -> 静态常数字符串 mainScreen = '/main';


1
@codygray 我不认为这是重复的。另一个问题并没有像这个问题一样试图解决错误。 - DarkNeuron
@Dark 这里接受的答案(由提问者发布)仅仅是指向另一个问题答案的链接。很难看出它不是重复的。问题的表述或形式并不重要;重要的是它们有相同的答案。我当然愿意重新考虑,因为我不是Dart或Flutter专家,但两个问题有相同的答案是非常强烈的暗示这些问题是重复的。 - Cody Gray
1个回答

26

我花了很长时间才找到答案,但如果有人陷入这个问题中,请参考Rémi Rousselet对另一个问题的回答,这就是解决我的方法:

 Navigator.pushReplacement(
  context,
  MaterialPageRoute(settings: RouteSettings(name: "Foo")),
);

使用名称将设置添加到MaterialPageRoute中,然后这样调用popUntil:

Navigator.popUntil(context, ModalRoute.withName("Foo"))

1
我的所有路由都有命名,但使用popUntil时仍会出现错误。参见:https://github.com/flutter/flutter/issues/16602 - DarkNeuron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接