带参数的 Flutter 初始路由

标签 flutter dart navigator

我需要为我的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/

相关文章:

Android Studio 启动器图标 - 必须设置图标名称

sockets - Flutter 应用程序无法与证书握手错误 CERTIFICATE_VERIFY_FAILED 建立套接字连接

android - 构建 flutter com.android.builder.internal.aapt.v2.Aapt2Exception : Android resource linking failed

firebase - 用户每次在Flutter中登录Firebase时数据都会更新吗?

dart - 如何在flutter中使用JSON通过post发送图像?

android - 是否可以使用 navigator.pop 刷新或重新加载页面...比如第 1(nav.push=>2)页面到第 2 页,然后从第 2(nav.pop,值)返回到第 1 页?

Xcode:在调试时,有什么方法可以阻止它在最前面的窗口中打开导航器?

flutter - 将输入字段和按钮放在屏幕中央

generics - 使用带有泛型的 Dart 的 call() 方法

Flutter & Navigator & ImagePicker : Why can I proceed to the next page? 查找停用的小部件的祖先是不安全的