Flutter 颤振:使用Navigator pushNamed将参数作为对象调用

Flutter 颤振:使用Navigator pushNamed将参数作为对象调用,flutter,dart,Flutter,Dart,我使用MaterialApp with router导航到下一个屏幕,我使用它导航到另一个屏幕并传递参数: onTap: () => Navigator.of(context).pushNamed( DetailDebt.routedName, arguments: { 'receiverName

我使用MaterialApp with router导航到下一个屏幕,我使用它导航到另一个屏幕并传递参数:

onTap: () => Navigator.of(context).pushNamed(
                                DetailDebt.routedName,
                                arguments: {
                                  'receiverName': debtListView.receiverName,
                                  'amount': debtListView.amount,
                                  'dateReturn': debtListView.dateReturn,
                                  'pathImage': debtListView.imageReceiver,
                                  'signatureImage': debtListView.imageSignature,
                                },
                              ),
在下一个屏幕中,我使用make variable存储参数,如下所示:

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,
        ),
      ),
    );

谢谢

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

onPressed:(){
Navigator.of(context.pushNamed('my_route',参数:100);
},
在my
MaterialApp
中,我设置了
onGenerateRoute
参数以生成具有给定参数的新路由:

onGenerateRoute:(设置){
开关(设置.名称){
案例“我的路线”:返回物料路线(
builder:(context)=>HomePage(settings.arguments为int),//传递参数
设置:设置,
);
默认值:抛出异常(“未知路由”);
}
},
现在我可以访问
build
方法中的值:

类主页扩展StatefulWidget{
最终整型参数;
主页(this.arguments,{Key}):超级(Key:Key);
@凌驾
State createState()=>_HomePageState();
}
类_HomePageState扩展状态{
int值;
@凌驾
void initState(){
super.initState();
value=widget.arguments;
}
@凌驾
小部件构建(构建上下文){
返回文本('Value from arguments:${widget.arguments}');
}
}
或者,您可以通过
initState
中的路由参数设置值,如下所示:

int值;
@凌驾
void initState(){
super.initState();
WidgetsBinding.instance.addPostFrameCallback((){
设置状态(){
value=ModalRoute.of(this.context).settings?.arguments;
});
打印(“路由参数的设置值”);
});
}

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

在您的示例生成器中:(context)=>主页(settings.arguments为int)。只传递了1个参数,但如何像上面的问题一样传递多个参数?@ZeffryReynando您可以传递任何想要作为参数的对象,例如映射或创建类并实例化该类的对象
int
只是一个例子。让我把这一点讲清楚,例如,我像我的问题一样使用Map在pushNamed中传递参数。所以在onGenerateRoute中,我写的是这样的主页(settings.arguments为Map),对吗?我的问题是如何在主页中启动?@ZeffryReynando没错。您可以在
initState
中使用此值来初始化变量,或者只在
build
中访问它;主页({this.arguments});现在我不知道如何使argument对象,我可以这样称呼它:arguments.receiverName、arguments.amount、arguments.dateReturn等等
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
}