Navigator.pop
方法只能返回一个值,但我需要返回多个值。
有没有办法使用 Navigator.pop()
返回多个值?
我以前使用过
Navigator.push
,但是当我将多个变量从多个页面推送到一页时,它显示构造错误。
我已经被困在这里好几天了。
请帮助我。
提前致谢。
您可以通过两种方式
pop
:
Navigator.of(context).pop(object);
或
Navigator.pop(context, object);
无论哪种方式,我都用
object
标记了该方法的 可选 返回值。
如果您希望返回多个值,则需要将它们装箱在一个对象中,
class
或Map
或其他任何东西。
班级拳击看起来像这样:
class BoxedReturns{
final int a;
final int b;
BoxedReturns(this.a, this.b);
}
//stuff
Navigator.of(context).pop(BoxedReturns(1,2));
您可以使用地图做类似的事情,尽管我宁愿使用类方法:
Navigator.of(context).pop({"a":1,"b":2});
您可以使用地图
final data = { "key1" : "value1", "key2" : "value2" };
Navigator.of(context).pop(data);
为了能够通过
Navigator.pop()
返回多个值,你可以做两件事(当然还有更多方法,但这些是一些基本的方法):
1。创建保存这些数据的模型:
class YourClass {
String firstVar;
String secondVar;
int thirdVar;
News(
{this.firstVar,
this.secondVar,
this.thirdVar});
}
在您想要使用
Navigator.pop()
返回数据的视图中:
...
Navigator.pop(context, YourClass('test', 'test2', '1'));
2。使用
Map
来保存嵌套(在我的例子中是元组):
...
Map<String, int> myData = new Map();
myData['test'] = 1;
myData['test2'] = 2;
Navigator.pop(context, myData);
创建一个包含所有数据的新数据结构类。
您也可以使用地图或列表,但如果数据结构发生变化,这将是一个可能的错误源。
类似的问题带有返回数据的Flutter后退按钮。
Deepak Thakur 的代码片段
class DetailsClassWhichYouWantToPop {
final String date;
final String amount;
DetailsClassWhichYouWantToPop(this.date, this.amount);
}
void getDataAndPop() {
DetailsClassWhichYouWantToPop detailsClass = new DetailsClassWhichYouWantToPop(dateController.text, amountController.text);
Navigator.pop(context, detailsClass); //pop happens here
}
new RaisedButton(
child: new Text("Edit"),
color: UIData.col_button_orange,
textColor: Colors.white,
onPressed: getDataAndPop, //calling pop here
),
简单示例:
您可以通过result参数发送您的自定义对象。
推入新屏幕并从新屏幕获取结果: 导航到新屏幕等待 then() 或 complete() 事件发生。
pushToNewScreen() {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => NewScreen()),
).then((value) {
// if value is true you get the result as bool else no result
if (value != null && value == true) {
print('Do something after getting result');
} else {
print('Do nothing');
}
});
}
发生某些事件时从新屏幕获取数据
ontap: (){
// pass your custom object inlace of bool value
Navigator.pop(context, true);
}