如何等待被调用的侦听器和 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;
  }