如何在 flutter 中使用 Navigator.pop() 方法传递多个值?

问题描述 投票:0回答:7

Navigator.pop
方法只能返回一个值,但我需要返回多个值。 有没有办法使用
Navigator.pop()
返回多个值?

我以前使用过

Navigator.push
,但是当我将多个变量从多个页面推送到一页时,它显示构造错误。

我已经被困在这里好几天了。

请帮助我。

提前致谢。

flutter flutter-layout
7个回答
6
投票

您可以通过两种方式

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

2
投票

您可以使用地图

final data = { "key1" : "value1", "key2" : "value2" };
Navigator.of(context).pop(data);

1
投票

为了能够通过

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

0
投票

创建一个包含所有数据的新数据结构类。
您也可以使用地图或列表,但如果数据结构发生变化,这将是一个可能的错误源。


0
投票

类似的问题带有返回数据的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
  ),

0
投票

简单示例:

您可以通过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);
}

0
投票

从 Dart 3.0 开始,您可以使用

Record

Navigator.of(context).pop((firstValue, secondValue));
© www.soinside.com 2019 - 2024. All rights reserved.