【问题标题】:Return null Future from Navigator.pop()从 Navigator.pop() 返回 null Future
【发布时间】:2021-07-30 00:05:49
【问题描述】:

如官方文档中所述,我将值从一个页面传递到另一个页面。 https://flutter.dev/docs/cookbook/navigation/returning-data

我实现了两个不同的按钮。

  1. 提交按钮,返回一个字符串列表。

  2. 返回 null 的关闭按钮。

                 ElevatedButton(
                 onPressed: () async {
                   _formKey.currentState?.save();
                   if (_formKey.currentState!.validate()) {
                     _formKey.currentState?.fields.forEach((key, value) {
                       // return a list with the names
                       widget._names.add(value.value);
                       print(widget._names);
                     });
                     Navigator.pop(context, widget._names);
                   }
                 },
                 child: Text('Speichern & Zurück')),
             OutlinedButton(
                 onPressed: () {
                   Navigator.pop(context, null);
                 },
                 child: Text('Verwerfen & Zurück'))
    

该值是 Navigator.push() - 方法的返回值。

                            result = Navigator.push(
                            context,
                            MaterialPageRoute(
                                builder: (context) => PlayerNames(
                                    _currentBoySliderValue,
                                    _currentGirlSliderValue)));

我通过简单的检查来捕获 null Future:

                      if (result != null) {
                    // does not catch Future<dynamic> with null content 
                  }

不幸的是,Future(结果)只有在 Page PlayerNames() 从未被调用时才为 null,因为按下返回 null 的按钮不会使 Future 变为 null,而是使其内容变为 null。这会导致无意的行为,即如果用户在页面中未插入数据并使用按钮,这会导致返回 null,我的方法将在未来使用 null 值调用。

如果存储此信息的值是目标,是否有机会将 Future 设置为 null?我不想添加代码来检查未来的值是否为空,因为它并不总是允许有空数据。

【问题讨论】:

  • 您应该在等待PlayerNames 的回复时添加await。如果您需要进一步说明,请告诉我。
  • 那行得通,但我不知道为什么。你能澄清一下吗?
  • 另外我必须将 Future 结果更改为 List?结果;

标签: flutter dart null navigator


【解决方案1】:

您应该在等待PlayerNames 的回复时添加await

要在 Flutter 中从另一个屏幕返回数据,您必须等待屏幕完成并返回数据。 await 关键字等待屏幕完成。

如需进一步说明,您可以关注this链接

【讨论】:

    【解决方案2】:

    也许,改为返回null,只需返回一个空数组'[]',然后验证结果是否为空。

    Navigator.pop(context, []);
    
    
          if (result.isEmpty()) {
        // do some stuff
      }
    
    

    【讨论】:

    • 谢谢,但这不起作用,因为并不总是允许返回空列表。 widget._names 的内容可以为空,这会导致错误的断言。我基本上希望空按钮是某种取消选项,可以跳出页面而不更改代码或状态的任何内容。
    【解决方案3】:

    您将返回数据类型更改为 Map 怎么样?

                 ElevatedButton(
                 onPressed: () async {
                   _formKey.currentState?.save();
                   if (_formKey.currentState!.validate()) {
                     _formKey.currentState?.fields.forEach((key, value) {
                       // return a list with the names
                       widget._names.add(value.value);
                       print(widget._names);
                     });
                     Navigator.pop(context, { 'isExistData': true, 'data': widget._names });
                   }
                 },
                 child: Text('Speichern & Zurück')),
             OutlinedButton(
                 onPressed: () {
                   Navigator.pop(context, { 'isExistData': false });
                 },
                 child: Text('Verwerfen & Zurück'))
    
    if (result['isExistData']) {
      // Do something
      var data = result['data']
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多