如何等待被调用的侦听器和 return 未来值
How to await a listener being called and return a Future value
我有一个 Future 函数,可以将侦听器添加到 ValueNotifier。我怎样才能 return 调用侦听器时检索到的值?
Map<String,ValueNotifier<String>> _data = {};
Future<String> getAnswer(String text) async {
if (_data["answer"] == null || _data["answer"]!.value.isEmpty) {
_data["answer"] = ValueNotifier<String>("");
_data["answer"]!.addListener(() {
if (_data["answer"]!.value.isNotEmpty) {
// somehow return _data["answer"]!.value
} else {
// continue waiting for next listener call
}
});
} else {
return _data["answer"]!.value;
}
return await //not sure what to put here.
}
似乎您总是想在更新后立即使用 _data['answer']
的值。在这种情况下,您应该尝试使用 Riverpod 库:https://pub.dev/packages/flutter_riverpod 该库将帮助您监视通知程序,然后在数据更新时重建有状态的小部件。
好的,我发现在这种情况下有效的解决方案是使用 Completer(),如下所示:
Map<String,ValueNotifier<String>> _data = {};
Future<String> getAnswer(String text) async {
var completer = Completer<String>();
if (_data["answer"] == null || _data["answer"]!.value.isEmpty) {
_data["answer"] = ValueNotifier<String>("");
_data["answer"]!.addListener(() {
if (_data["answer"]!.value.isNotEmpty) {
completer.complete(_data["answer"]!.value);
_data["answer"]!.dispose();
}
});
} else {
return _data["answer"]!.value;
}
return completer.future;
}
我有一个 Future 函数,可以将侦听器添加到 ValueNotifier。我怎样才能 return 调用侦听器时检索到的值?
Map<String,ValueNotifier<String>> _data = {};
Future<String> getAnswer(String text) async {
if (_data["answer"] == null || _data["answer"]!.value.isEmpty) {
_data["answer"] = ValueNotifier<String>("");
_data["answer"]!.addListener(() {
if (_data["answer"]!.value.isNotEmpty) {
// somehow return _data["answer"]!.value
} else {
// continue waiting for next listener call
}
});
} else {
return _data["answer"]!.value;
}
return await //not sure what to put here.
}
似乎您总是想在更新后立即使用 _data['answer']
的值。在这种情况下,您应该尝试使用 Riverpod 库:https://pub.dev/packages/flutter_riverpod 该库将帮助您监视通知程序,然后在数据更新时重建有状态的小部件。
好的,我发现在这种情况下有效的解决方案是使用 Completer(),如下所示:
Map<String,ValueNotifier<String>> _data = {};
Future<String> getAnswer(String text) async {
var completer = Completer<String>();
if (_data["answer"] == null || _data["answer"]!.value.isEmpty) {
_data["answer"] = ValueNotifier<String>("");
_data["answer"]!.addListener(() {
if (_data["answer"]!.value.isNotEmpty) {
completer.complete(_data["answer"]!.value);
_data["answer"]!.dispose();
}
});
} else {
return _data["answer"]!.value;
}
return completer.future;
}