Return 来自 Navigator.pop() 的空未来
Return null Future from Navigator.pop()
我按照官方文档中的说明将值从一个页面传递到另一个页面。 https://flutter.dev/docs/cookbook/navigation/returning-data
我实现了两个不同的按钮。
提交按钮,其中 return 是一个字符串列表。
关闭按钮 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
我按照官方文档中的说明将值从一个页面传递到另一个页面。 https://flutter.dev/docs/cookbook/navigation/returning-data
我实现了两个不同的按钮。
提交按钮,其中 return 是一个字符串列表。
关闭按钮 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