我需要为我的initialRoute
传递一个参数。我找到了这个issue并尝试如下:
initialRoute: AuthService.isLoggedIn() ? Views.home : Views.firstStart,
onGenerateInitialRoutes: (String initialRouteName) {
return [
AppRouter.generateRoute(
RouteSettings(
name: AuthService.isLoggedIn() ? Views.home : Views.firstStart,
arguments: notificationPayloadThatLaunchedApp,
),
),
];
},
onGenerateRoute: AppRouter.generateRoute,
这几乎有效。我遇到的问题是,不知怎的,在调用这个之后......
Navigator.pushReplacementNamed(
context,
Views.loading,
);
...我的 Multiprovider
(它是我的 GetMaterialApp
的父级)再次被调用,这导致我的应用程序崩溃,因为我在初始化提供程序时调用了一个函数:
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) {
var dataProvider = DataProvider();
dataProvider.init( // <- this is called again which should not happen
context,
);
return dataProvider;
},
),
],
child: GetMaterialApp(
title: 'Flutter Boilerplate',
navigatorKey: Get.key,
initialRoute: AuthService.isLoggedIn() ? Views.home : Views.firstStart,
onGenerateInitialRoutes: (String initialRouteName) {
return [
AppRouter.generateRoute(
RouteSettings(
name: AuthService.isLoggedIn() ? Views.home : Views.firstStart,
arguments: notificationPayloadThatLaunchedApp,
),
),
];
},
onGenerateRoute: AppRouter.generateRoute,
),
);
}
我觉得我传递初始参数的方式是错误的。还有其他/更好的方法来完成这项工作吗?如果您需要更多信息,请告诉我!
最佳答案
我认为您误解了新 API onGenerateInitialRoutes 的使用,因为它应该在不调用的情况下加载
Navigator.pushReplacementNamed(
context,
Views.loading,
);
完全没有API。如果您从另一个小部件调用此路线,则意味着这已经是第二条路线了。它应该是您的应用程序的默认路由。因此为初始路由提供参数根本没有意义。
由于您已经使用了 Provider Package,因此最好通过 Provider API 本身获取您想要发送的任何参数(参数)。
如果你想提供硬编码数据,那么只需将其视为普通的 Widget 类即可。
home: MyHomePage(name:"参数名称",data:DataHome()), :
GetMaterialApp(
title: 'Flutter Boilerplate',
navigatorKey: Get.key,
home: MyHomePage(name:"parameter name",data:DataHome()),
onGenerateRoute: AppRouter.generateRoute,
);
请注意,如果您调用 Navigator.pushReplacementNamed API 。你的提供者将会消失,因为 Flutter Widget Tree 大多数 Navigator API 都会从根创建一个新的 Widget 树级别。因为提供者只提供其所有 child 。因此您无法使用任何提供者数据,因为您有不同的祖先。
因此,如果您只有一页要访问,我建议您使用 MaterialApp API 中的 home 属性,因为它会将您的初始页面视为子页面,而 Provider API 可以在Widget树中接收数据,它有一个Ancestor Provider API:
MultiProvider(
providers: [
ChangeNotifierProvider(
如果您想在主页之后通过导航器在页面之间移动。 考虑使用NestedNavigator所以 flutter 不会从 widget 树的根创建新的路由。因此您仍然可以访问 Provider API 的数据。
从你的变量名猜测。我假设您想要处理通知 路由,检查这个deeplink
关于带参数的 Flutter 初始路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72031832/