Flutter直接通过命名路线导航传递参数

时间:2019-05-26 15:12:40

标签: flutter flutter-navigation

在进行命名路线导航时,我一直在查看此处的所有答案以传递参数,但它们似乎是旧答案或无法正常工作。

从编写的内容来看,它应该可以工作,但是似乎什么也没做,所以我不确定我的错误在哪里。

这是我的设置方式:

Main.dart (使用我的命名路由设置):

  void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primaryColor: Colors.white,
        ),
        initialRoute: HomePageScreen.id,
        routes: {
          HomePageScreen.id: (context) => HomePageScreen(),
          AddItemScreen.id: (context) => AddItemScreen(),
          AdvertiseScreen.id: (context) => AdvertiseScreen(),
          HomePageFilterScreen.id: (context) => HomePageFilterScreen(),
          HomePageResultsScreen.id: (context) => HomePageResultsScreen(),
          ItemPageProfileScreen.id: (context) => ItemPageProfileScreen(),
          ItemPageProfileSuggestUpdateScreen.id: (context) => ItemPageProfileSuggestUpdateScreen(),
          ItemPageWhereToBuyAddStoreToDatabaseScreen.id: (context) => ItemPageWhereToBuyAddStoreToDatabaseScreen(),
          ItemPageWhereToBuyMapScreen.id: (context) => ItemPageWhereToBuyMapScreen(),
          ItemPageWhereToBuyScreen.id: (context) => ItemPageWhereToBuyScreen(),
          MenuScreen.id: (context) => MenuScreen(),
          NotAvailableScreen.id: (context) => NotAvailableScreen(),
          TermsScreen.id: (context) => TermsScreen(),
          }
   );
  }
}

HomePageResultsScreen.dart (在按钮上单击“我正在使用名为的推式导航到下一页,因为新页面'ItemPageProfileScreen正在打开”,所以此方法有效)

onTap: () {
           Navigator.pushNamed(context, ItemPageProfileScreen.id, arguments: 'MyTestString');
          }

ItemPageProfileScreen.dart (我尝试使用MaterialApp onGenerateRoute来获取参数并打印到屏幕上进行测试,但无法正常工作):

  class ItemPageProfileScreen extends StatefulWidget {

  static const String id = 'item_page_profile_screen';

  @override
  _ItemPageProfileScreenState createState() => _ItemPageProfileScreenState();
}

class _ItemPageProfileScreenState extends State<ItemPageProfileScreen> {
  @override
  Widget build(BuildContext context) {

    MaterialApp(
      onGenerateRoute: (routeSettings){
        final arguments = routeSettings.arguments;
        print(arguments.toString());
      },
    );

    return Scaffold(),

感谢您的帮助。

EDIT第二次尝试:

class ItemPageProfileScreen extends StatefulWidget {

  final String argument;

  ItemPageProfileScreen(this.argument);

  static const String id = 'item_page_profile_screen';

  @override
  _ItemPageProfileScreenState createState() => _ItemPageProfileScreenState();
}

class _ItemPageProfileScreenState extends State<ItemPageProfileScreen> {
  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            Text(widget.argument),

1 个答案:

答案 0 :(得分:1)

有一篇有关如何使用命名路由传递参数的官方文章。 https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments

主要思想非常简单:将参数传递到屏幕小部件的构造函数

在官方文档中(在上面的链接中),即使文章中提到了命名路由,他们实际上同时使用了命名路由和常规路由这两种方法。

无论如何。专注于构造函数和参数。

如果在导航时仅传递路线名称,那么在哪里可以使用命名的路线访问屏幕的构造函数?在onGenerateRoute方法中。开始吧。

1。在顶部屏幕 MyApp 中覆盖onGenerateRoute方法(这就是您的错误所在)。而且,如果您这样做,则不需要routes: {}(第二个错误)

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primaryColor: Colors.white,
        ),
        initialRoute: HomePageScreen.id,
        onGenerateRoute: (settings){

        if(settings.name == ItemPageProfileScreen.id){
          String msg = settings.arguments;
          return MaterialPageRoute(builder: (_) => ItemPageProfileScreen(msg));
        }else if(...

    },

2。从窗口小部件构造函数获取参数:

class ItemPageProfileScreen extends StatefulWidget {
  final String argument;

  ItemPageProfileScreen(this.argument);

  static const String id = 'item_page_profile_screen';

@override
_ItemPageProfileScreenState createState() => _ItemPageProfileScreenState();
}

class _ItemPageProfileScreenState extends State<ItemPageProfileScreen> {
  @override
  Widget build(BuildContext context) {
    String msg = widget.argument;
    ...

3。并通过点击发送争论:

onTap: () {Navigator.pushNamed(context, ItemPageProfileScreen.id, arguments: 'MyTestString');}

希望这会有所帮助。