Dart:可取消post延迟/未来

Dart: cancelable post delay / future

我是 Flutter 的新手,我想通过调用 API 从 InputField 翻译一些文本。但是我不想在每次击键时调用它,而是仅在用户暂停输入时调用它。

在 Android 上,我只会使用 Handler class 和 postDelay() 并预先调用 removeAllCallbacksAndMessages(null)。有没有办法在 Dart 上做类似的事情?

这是我当前的代码:

Future<String> getTranslation(String query, Language from, Language to) async {
    // cancel here if a call to this function was less than 500 millis ago.
    return Future.delayed(const Duration(milliseconds: 500), () {
      return _translator.translate(query, from: from.code, to: to.code)
    });
  }

编辑 1

我像这样从我的 Bloc 调用代码:

@override
  Stream<State> mapEventToState(Event event) async* {
    if (event is QueryChangeEvent) {
      yield TextTranslationChangeState(
          query: event.query ?? "",
          translation: await _repo.getTranslation(event.query, currentState.fromLang, currentState.toLang));
  }

这就是为什么我不能在未来调用 .then(),因为我无法从嵌套函数的块中产生新状态。

感谢任何帮助!

假设您使用 TextField 作为输入,您可以调用 getTranslation()onSubmitted 上,将在用户完成编辑时调用:

 TextField(
   onSubmitted: (value) {
     getTranslation(value, 'en', 'ru'); 
   },
 );

是的,它叫做定时器

https://api.dartlang.org/stable/2.3.1/dart-async/Timer-class.html

您可以延迟执行并取消触发。

您可以使用CancelableOperation取消Future异步操作。

这是一个例子(p.s我简化了你的方法签名以便于测试它)

  CancelableOperation cancellableOperation;

  Future<dynamic> fromCancelable(Future<dynamic> future) async {
    cancellableOperation?.cancel();
    cancellableOperation = CancelableOperation.fromFuture(future, onCancel: () {
      print('Operation Cancelled');
    });
    return cancellableOperation.value;
  }

  Future<dynamic> getTranslation(String query, String from, String to) async {
    return Future.delayed(const Duration(milliseconds: 1000), () {
      return "Hello";
    });
  }

在文本更改侦听器上:

  onTextChanged() {
    fromCancelable(getTranslation("query", "EN", "TR")).then((value) {
      print("Then called: $value");
    });
  }

示例输出:

I/flutter ( 7312): Operation Cancelled
I/flutter ( 7312): Operation Cancelled
I/flutter ( 7312): Operation Cancelled
I/flutter ( 7312): Operation Cancelled
I/flutter ( 7312): Then called: Hello