首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dart:可取消的延迟/未来

Dart:可取消的延迟/未来
EN

Stack Overflow用户
提问于 2019-05-28 15:53:21
回答 3查看 3.9K关注 0票数 4

我是新手,我想通过调用API从InputField中翻译一些文本。但是,我不想对每一个键笔画都调用它,而是只在用户暂停输入时才调用它。

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

以下是我的当前代码:

代码语言:javascript
运行
复制
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

我从我的集团中调用代码如下:

代码语言:javascript
运行
复制
@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()的原因,因为我无法从嵌套函数的块中产生新的状态。

任何帮助都是非常感谢的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-28 16:52:51

您可以通过使用Future实现取消CancelableOperation异步操作。

下面是一个示例(p.s .我简化了您的方法签名以便于测试)

代码语言:javascript
运行
复制
  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";
    });
  }

在文本更改侦听器上:

代码语言:javascript
运行
复制
  onTextChanged() {
    fromCancelable(getTranslation("query", "EN", "TR")).then((value) {
      print("Then called: $value");
    });
  }

样本输出:

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2019-05-28 16:07:25

是的,它叫计时器。

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

可以延迟执行,也可以取消触发器。

票数 2
EN

Stack Overflow用户

发布于 2019-05-28 16:04:28

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

代码语言:javascript
运行
复制
 TextField(
   onSubmitted: (value) {
     getTranslation(value, 'en', 'ru'); 
   },
 );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56345983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档