首页 > 解决方案 > Flutter 传递的参数总是返回 null

问题描述

在这个简单的颤动GitHub存储库实现中,我们有一个简单的屏幕,我们想要传递参数并将它们放在目标屏幕中,例如

ScreenA()我们想要传递参数的表单ScreenB()

定义的路线:

routes: {
  '/page/one': (context) => ScreenA(),
  '/page/two': (context) => ScreenB(),
  '/page/three': (context) => ScreenC(),
},

我们所有的拳头ScreenA()

class ScreenA extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Navigation with params'),
      ),
      body: Center(
        child:  ElevatedButton(
          child: Text('Click me!'),
          onPressed: () {
            Navigator.pushNamed(
              context,
              '/page/two',
              arguments: PageArguments(
                  id: 1,
                  title: "Example Title"
              ),
            );
          },
        ),
      ),
    );
  }
}

和目标页面原样ScreenB()

class ScreenB extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final arguments = ModalRoute.of(context)!.settings.arguments;

    /* getting currect route name */
    print(ModalRoute.of(context)!.settings.name);

    /* getting NULL arguments */
    print(arguments);

    return Scaffold();
  }
}

class PageArguments{
  final int id;
  final String title;
  PageArguments({required this.id, required this.title});
}

标签: flutterdart

解决方案


似乎 Persistent Bottom Navigation Bar 包没有正确传递路线信息,这可能是一个错误。如果你在 的build方法中设置断点ScreenB,你会看到不仅参数为空,而且路由名称也错误。

我尝试过main.dartonGenerateRoute它以这种方式对我有用:


  List<PersistentBottomNavBarItem> _navBarsItems() {
    return [
      PersistentBottomNavBarItem(
          title: 'Home',
          icon: Icon(Icons.home),
          routeAndNavigatorSettings: RouteAndNavigatorSettings(
              initialRoute: '/page/one',
              onGenerateRoute: (RouteSettings settings) {
                WidgetBuilder builder;
                // Manage your route names here
                switch (settings.name) {
                  case '/page/one':
                    builder = (BuildContext context) => ScreenA();
                    break;
                  case '/page/two':
                    builder = (BuildContext context) => ScreenB();
                    break;
                  default:
                    throw Exception('Invalid route: ${settings.name}');
                }
                return MaterialPageRoute(
                  builder: builder,
                  settings: settings,
                );
              })),
      PersistentBottomNavBarItem(title: 'Help', icon: Icon(Icons.help)),
    ];
  }

关于提出论点,我同意另一个答案。


推荐阅读