flutter - Flutter :- 如何像在 Android“SingleTask”中一样管理后台堆栈?
问题描述
我正在尝试管理我们从(例如,SingleTask、SingleTop、Standard 等)管理它的in ,为此backstack
我尝试过in 颤振,但没有成功,请检查下面的代码,我曾试图实现.Flutter
Android
launchMode
Routes
backstack
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**
════════════════════════════════════════════════════════════════════════════════════════════════════
解决方案
如果您使用以下代码使用 Navigator.popUntil 方法弹出路径“/A”,那么您应该在 MaterialApp Widget 中的“initialRoute”属性而不是“home”属性的帮助下设置打开屏幕。
Navigator.popUntil(context, ModalRoute.withName('/A'));
因为,在这里,您正在“推送导航器路线”的帮助下导航到路线“A”,并希望使用“命名路线”弹出
此外,您可以在您的路线属性中使用“/”路线将其设置为关注,
initialRoute : "A",
或者
routes:{
"/": (context)=> A(),
}
您的代码中的其他一切都很好。
推荐阅读
- java - 如何处理空点异常?
- python - 如何检查像素是否为空?
- python-2.7 - 使用 Python 脚本检查 Docker 的运行状况 - Python 2.7
- javascript - 使用 Google Apps 脚本将文件上传到我的 google 驱动器(在 GOOGLE 中没有表格)
- angular - 动态组件加载 - 将组件作为变量
- php - Laravel 在主模型旁边返回相关模型
- php - 等到 Curl 命令结束
- javascript - 执行节点 js 时出错:加载资源失败:服务器响应状态为 404(未找到)
- python - 使用新的串行设备扩展 Python Arcade
- amazon-ec2 - aws esc windows 容器 pseudoTerminal cloudwatch 输出带有奇怪的字符