【问题标题】:Passing arguments in navigator flutter在导航器颤动中传递参数
【发布时间】:2021-12-21 14:18:39
【问题描述】:

更新到新版本的颤振(空安全)后,我的应用程序出现问题。

我按照下面的代码设置了路由器和导航器,当我运行应用程序时,路由器返回错误:“类型 Null 不是类型转换中 ScreenArgs 类型的子项”

这可能是由于没有初始化类 ScreenArgs 的任何实例造成的,但我不知道错误在哪里。

布局:

final _navigatorKey = GlobalKey<NavigatorState>();
...

 return Scaffold(
  backgroundColor: Colors.white,
  body: Navigator(
   key: _navigatorKey,
   initialRoute: profileRoute,
    onGenerateRoute: generateRoute,
   ),
   bottomNavigationBar: navBar(),
  );

  void _onItemTapped(int index) {
    setState(() {
      _screenIndex = index;
    });
    switch (index) {
      case 0:
        _navigatorKey.currentState!.pushNamed(coursesRoute);
        break;
    }
  }

路由器:

Route<dynamic> generateRoute(RouteSettings settings) {
  final args = settings.arguments as ScreenArgs;

  switch (settings.name) {
    ...
    case profileRoute:
      return PageTransition(
          child: const ProfileScreen(), type: PageTransitionType.fade);

    case coursesRoute:
      return PageTransition(
          child: CoursesScreen(
            entityId: args.entityId,
          ),
          type: PageTransitionType.fade);
    ...
  }
}

屏幕参数:

class ScreenArgs {
  final String quizId;
  final String courseId;
  final String entityId;
  final numOfQuestions = numberOfQuestions;

  ScreenArgs(this.quizId, this.entityId, this.courseId);
}

我尝试在 Layout 中初始化 ScreenArgs 的实例并将其传递给导航器,如下所示:

final args = ScreenArgs("","","");

Navigator(
   key: _navigatorKey,
   initialRoute: profileRoute,
    onGenerateRoute: (args) {generateRoute(args);}
   ),
   bottomNavigationBar: navBar(),
  );

或者在itemTapped切换器中如下:

switch (index) {
      case 0:
        _navigatorKey.currentState!.pushNamed(profileRoute, arguments: args);
        break;

但没有任何效果,我收到了同样的错误消息,我被困了几个小时。如果有人看到我哪里出错了,请告诉我,提前谢谢。

【问题讨论】:

    标签: flutter router navigator dart-null-safety


    【解决方案1】:

    问题已解决。原因是初始化多个 GlobalKey 而导致错误的语句是

    _navigatorKey.currentState!.pushNamed(profileRoute, arguments: args);
    

    即检查

    .currentState!.
    

    将 GlobalKey 声明移动到全局变量中,并将其用于路由器的导航器和定位器,现在一切正常。

    【讨论】:

      猜你喜欢
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      相关资源
      最近更新 更多