Return null Future from Navigator.pop()



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

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

  1. 提交按钮,返回String列表。

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

我捕获空的未来通过简单地检查:

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

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

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

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

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

如需进一步说明,请点击此链接

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

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

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

最新更新