飞镖:可取消的发布延迟/将来

时间:2019-05-28 15:53:21

标签: flutter dart dart-async

我是扑朔迷离的新手,我想通过调用API翻译InputField中的一些文本。但是,我不想在每个按键时都调用它,而只在用户暂停键入时才调用它。

在Android上,我只需要将HandlerpostDelay()类一起使用,并事先调用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()的原因,因为我将无法从嵌套函数的块中产生新状态。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

是的,它叫做计时器

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

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

答案 1 :(得分:1)

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

这里是一个例子(请我简化了您的方法签名,以便于我轻松测试)

  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

答案 2 :(得分:0)

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

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