【问题标题】:How do i pass more than one values using Navigator.pop() method in flutter?如何在颤振中使用 Navigator.pop() 方法传递多个值?
【发布时间】:2019-12-13 16:39:37
【问题描述】:

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

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

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

请帮帮我。

提前致谢。

【问题讨论】:

  • 为什么要使用Navigator.pop()返回多个值?你试图制定什么逻辑?
  • 我只想从不同的页面获取数据到主页,我使用这些数据作为 api 的输入。我想做 momondo 应用程序在航班搜索中所做的事情。

标签: flutter flutter-layout


【解决方案1】:

您可以通过两种方式pop

Navigator.of(context).pop(object);

Navigator.pop(context, object);

不管怎样,我已经用object 标记了该方法的可选返回值。

如果您希望返回多个值,则需要将它们装箱到一个对象中,classMap 或其他任何东西。

使用类装箱将如下所示:

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】:

    为了能够通过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);
    

    【讨论】:

      【解决方案3】:

      你可以使用地图

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

      【讨论】:

        【解决方案4】:

        创建一个包含所有数据的新数据结构类。
        你也可以使用 map 或 list,但如果数据结构发生变化,这将是一个可能的 bug 来源。

        【讨论】:

          【解决方案5】:

          类似问题Flutter Back button with return data
          来自 Deepak Thakur 的代码 sn-p

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

          【讨论】:

          • 我们如何访问结果值?我收到Error: The getter 'amount' isn't defined for the class 'Object'. 之类的错误,并且程序无法编译。
          • @skadoosh,需要重现您的问题。你能把重现代码放到一个新问题上并ping我的名字吗?谢谢。
          【解决方案6】:

          简单示例:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-02
            • 2020-09-27
            • 1970-01-01
            • 2020-12-17
            • 1970-01-01
            • 2021-12-27
            • 1970-01-01
            相关资源
            最近更新 更多