【问题标题】:Flutter : Called the Arguments as Object using Navigator pushNamedFlutter:使用 Navigator pushNamed 将参数称为对象
【发布时间】:2019-12-05 13:55:48
【问题描述】:

我正在使用带有路由器的 MaterialApp 导航到下一个屏幕,我正在使用它导航到另一个屏幕并传递参数:

onTap: () => Navigator.of(context).pushNamed(
                                DetailDebt.routedName,
                                arguments: {
                                  'receiverName': debtListView.receiverName,
                                  'amount': debtListView.amount,
                                  'dateReturn': debtListView.dateReturn,
                                  'pathImage': debtListView.imageReceiver,
                                  'signatureImage': debtListView.imageSignature,
                                },
                              ),

在下一个屏幕中,我将创建变量来存储这样的参数:

final Map arguments = ModalRoute.of(context).settings.arguments as Map;
  return Scaffold(
      body: Container(
        child: Text(
          arguments['receiverName'],
        ),
      ),
    );

我的问题是,如何将参数存储在变量中,然后我可以这样称呼它:

// I want Store the Arguments in the variable , so i can call it something like this  : 
final Map arguments = ModalRoute.of(context).settings.arguments as Map;
final loadedArguments = arguments; // <= ???
  return Scaffold(
      body: Container(
        child: Text(
          loadedArguments.receiverName,
        ),
      ),
    );

如果你需要,它就是我的模特:

import 'dart:typed_data';

import 'package:hive/hive.dart';
part 'debt_model_hive.g.dart';

@HiveType()
class DebtModelHive extends HiveObject {
  @HiveField(0)
  String receiverName;
  @HiveField(1)
  int amount;
  @HiveField(2)
  DateTime dateReturn;
  @HiveField(3)
  String imageReceiver;
  @HiveField(4)
  Uint8List imageSignature;

  DebtModelHive({
    this.receiverName,
    this.amount,
    this.dateReturn,
    this.imageReceiver,
    this.imageSignature,
  });
  // Hive fields go here
}

谢谢

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    我将向您展示一个如何将参数传递给您的页面的简单示例。在这里,我推送一个新的命名路由,参数中包含 int 值:

    onPressed: () {
      Navigator.of(context).pushNamed('my_route', arguments: 100);
    },
    

    在我的MaterialApp 中,我设置了onGenerateRoute 参数以生成具有给定参数的新路由:

    onGenerateRoute: (settings) {
      switch (settings.name) {
        case 'my_route': return MaterialPageRoute(
          builder: (context) => HomePage(settings.arguments as int), // passing arguments
          settings: settings,
        );
        default: throw Exception('Unknown route');
      }
    },
    

    现在我可以访问 build 方法内部的值了:

    class HomePage extends StatefulWidget {
      final int arguments;
    
      HomePage(this.arguments, {Key key}) : super(key: key);
    
      @override
      State<StatefulWidget> createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      int value;
    
      @override
      void initState() {
        super.initState();
    
        value = widget.arguments;
      }
    
      @override
      Widget build(BuildContext context) {
        return Text('Value from arguments: ${widget.arguments}');
      }
    }
    

    或者,您可以在initState 中设置路由参数的值,如下所示:

      int value;
    
      @override
      void initState() {
        super.initState();
    
        WidgetsBinding.instance.addPostFrameCallback((_) {
          setState(() {
            value = ModalRoute.of(this.context).settings?.arguments;
          });
          print('setting value from route arguments');
        });
      }
    

    不过,它很脏,我不建议这样做。

    【讨论】:

    • 在您的示例中 builder: (context) => HomePage(settings.arguments as int)。它只传递了 1 个参数,但是我如何传递多个参数,就像我上面的问题一样?
    • @ZeffryReynando 您可以传递您想要的任何对象作为参数,例如映射或创建您的类并实例化此类的对象。 int 只是一个例子。
    • 让我清楚地说明这一点,例如,我使用 Map 在 pushNamed 中传递参数,就像我的问题一样。所以在 onGenerateRoute 我这样写 HomePage(settings.arguments as Map) 对吗?我的问题是如何在 HomePage 中发起?
    • @ZeffryReynando 没错。你可以在initState 中使用这个值来初始化一个变量,或者在build 中访问它。
    • 像这样:最终的地图参数;主页({this.arguments});现在我不知道创建参数对象,我可以这样称呼它:arguments.receiverName、arguments.amount、arguments.dateReturn 等
    猜你喜欢
    • 2020-09-03
    • 2021-09-07
    • 2021-09-09
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多