带有参数的 Flutter 初始路由
Flutter initial routes with parameters
我需要为我的 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,
),
);
}
我觉得我传递初始参数的方式是错误的。有什么 other/better 方法可以做到这一点吗?如果您需要更多信息,请告诉我!
我认为您误解了 new API onGenerateInitialRoutes 的用法,因为它应该在不调用
的情况下加载的名称
Navigator.pushReplacementNamed(
context,
Views.loading,
);
API 完全没有。如果你从另一个小部件调用这条路线,这意味着这已经是第二条路线了。它应该是您应用程序的默认路由。所以给初始路由一个参数是没有意义的。
既然你已经使用了 Provider Package,最好只获取你想通过 Provider API 本身发送的任何参数(参数)。
如果你想提供硬编码数据,那么就把它当作一个普通的Widget class。
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 中的 home 属性 API 因为它会将您的初始页面视为 child 并且 Provider API 可以接收 Widget 树中的数据,它有一个 Ancestor Provider API:
MultiProvider(
providers: [
ChangeNotifierProvider(
如果您想在主页之后通过导航器在页面之间移动。
考虑使用 NestedNavigator 这样 flutter 就不会从小部件树的根部创建新路由。所以您仍然可以访问提供商 API 的数据。
根据你的变量名猜测。我假设你想处理一个通知
路由,检查这个 deeplink
我需要为我的 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,
),
);
}
我觉得我传递初始参数的方式是错误的。有什么 other/better 方法可以做到这一点吗?如果您需要更多信息,请告诉我!
我认为您误解了 new API onGenerateInitialRoutes 的用法,因为它应该在不调用
的情况下加载的名称Navigator.pushReplacementNamed(
context,
Views.loading,
);
API 完全没有。如果你从另一个小部件调用这条路线,这意味着这已经是第二条路线了。它应该是您应用程序的默认路由。所以给初始路由一个参数是没有意义的。
既然你已经使用了 Provider Package,最好只获取你想通过 Provider API 本身发送的任何参数(参数)。
如果你想提供硬编码数据,那么就把它当作一个普通的Widget class。
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 中的 home 属性 API 因为它会将您的初始页面视为 child 并且 Provider API 可以接收 Widget 树中的数据,它有一个 Ancestor Provider API:
MultiProvider(
providers: [
ChangeNotifierProvider(
如果您想在主页之后通过导航器在页面之间移动。 考虑使用 NestedNavigator 这样 flutter 就不会从小部件树的根部创建新路由。所以您仍然可以访问提供商 API 的数据。
根据你的变量名猜测。我假设你想处理一个通知 路由,检查这个 deeplink