Return 来自 Navigator.pop() 的空未来

Return null Future from Navigator.pop()

我按照官方文档中的说明将值从一个页面传递到另一个页面。 https://flutter.dev/docs/cookbook/navigation/returning-data

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

  1. 提交按钮,其中 return 是一个字符串列表。

  2. 关闭按钮 return 为空。

                 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() - 方法的 return 值。

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

我通过简单地检查就捕获了 null Future:

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

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

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

也许,而不是 return null,只是 return 一个空数组 '[ ]' 然后验证结果是否为空。

Navigator.pop(context, []);

      if (result.isEmpty()) {
    // do some stuff
  }

如何将 return 数据类型更改为 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']

}

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

要return从Flutter中的另一个屏幕获取数据,你必须等待屏幕完成并return数据。 await 关键字等待屏幕结束。

进一步说明,可以关注thislink