Flutter 颤振:使用Navigator pushNamed将参数作为对象调用
我使用MaterialApp with router导航到下一个屏幕,我使用它导航到另一个屏幕并传递参数:Flutter 颤振:使用Navigator pushNamed将参数作为对象调用,flutter,dart,Flutter,Dart,我使用MaterialApp with router导航到下一个屏幕,我使用它导航到另一个屏幕并传递参数: onTap: () => Navigator.of(context).pushNamed( DetailDebt.routedName, arguments: { 'receiverName
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);
},
在myMaterialApp
中,我设置了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
}