首页 > 解决方案 > Flutter :- 如何像在 Android“SingleTask”中一样管理后台堆栈?

问题描述

我正在尝试管理我们从(例如,SingleTask、SingleTop、Standard 等)管理它的in ,为此backstack我尝试过in 颤振,但没有成功,请检查下面的代码,我曾试图实现.FlutterAndroidlaunchMode Routesbackstack

Widget makeRoute(
    {@required BuildContext context,
    @required String routeName,
    Object arguments}) {
  final Widget child =
      _buildRoute(context: context, routeName: routeName, arguments: arguments);
  return child;
}

Widget _buildRoute({
  @required BuildContext context,
  @required String routeName,
  Object arguments,
}) {
  switch (routeName) {
    case '/':
      return SplashScreen();

    case '/A':              //// NAME OF SCREEN IS A
      return A();

    case '/B':              //// NAME OF SCREEN IS B
      MyBean docs = arguments as MyBean;
      return B(dataToShow: docs);

    case '/C':              //// NAME OF SCREEN IS C
      MyBean docs = arguments as MyBean;
      return C(dataToShow: docs);

    case '/D':             //// NAME OF SCREEN IS D
      return D();


  }
}

我从 A->B->C->D 跳转屏幕如下,
从 A->B ,我如下所示导航。

Navigator.of(context).pushNamed('/B');

从 B->C ,我如下所示进行导航。

 Navigator.of(context).pushNamed('/C', arguments: myList[index]);

最后,从 C->D ,我如下所示进行导航。

Navigator.of(context).pushNamed('/D');

从上面的代码中,我成功地导航到了 A----->D 屏幕并且也成功地携带了数据。

但我主要担心的是我想使用 backstack 从 D->A 或 D->B 屏幕导航而不打开另一个屏幕,所以我尝试了下面的代码但它不起作用,请检查下面的代码。

从 D->A,我尝试过

Navigator.popUntil(context, ModalRoute.withName('/A'));

甚至像下面这样尝试过。

 Navigator.of(context)
          .popUntil(ModalRoute.withName("/A"));

我什至通过这种方式来管理如下所示的流程

 SchedulerBinding.instance.addPostFrameCallback((_) {
                      Navigator.popUntil(context, ModalRoute.withName('/A'));

                    });

但两者都无法正常工作
请检查我的main()课程

void main() {
  runApp(
      MaterialApp(
        debugShowCheckedModeBanner: false,
        title: '',
        theme: ThemeData(
          brightness: Brightness.light,
          primarySwatch: Colors.grey,
          primaryColor: ColorConst.PRIMARY_COLOR,
          accentColor: ColorConst.ACCENT_COLOR,
          primaryColorBrightness: Brightness.light,


          accentColorBrightness: Brightness.light,
        ),

          onGenerateRoute: (RouteSettings settings) {
            return MaterialPageRoute(
              builder: (BuildContext context) => makeRoute(
                context: context,
                routeName: settings.name,
                arguments: settings.arguments,
              ),
              maintainState: true,
              fullscreenDialog: false,
            );
          }

      )
  );
}

并从上面的代码中获取以下异常,如下所示。

═ (2) Exception caught by widgets library ═══════════════════════════════════════════════════
'package:flutter/src/widgets/navigator.dart': Failed assertion: line 2330 pos 12: '!_debugLocked': is not true.
The relevant error-causing widget was: 
  MaterialApp **file:///Users/apple/Documents/BitBucket%20Projects/loyalityapp_android/lib/main.dart:10:7**
════════════════════════════════════════════════════════════════════════════════════════════════════

从 D->A 导航时获取执行

标签: flutterflutter-dependenciesback-stack

解决方案


如果您使用以下代码使用 Navigator.popUntil 方法弹出路径“/A”,那么您应该在 MaterialApp Widget 中的“initialRoute”属性而不是“home”属性的帮助下设置打开屏幕。

Navigator.popUntil(context, ModalRoute.withName('/A'));

因为,在这里,您正在“推送导航器路线”的帮助下导航到路线“A”,并希望使用“命名路线”弹出

此外,您可以在您的路线属性中使用“/”路线将其设置为关注,

initialRoute : "A",

或者

routes:{
          "/": (context)=> A(),
}

您的代码中的其他一切都很好。


推荐阅读