我是新手,我想通过调用API从InputField中翻译一些文本。但是,我不想对每一个键笔画都调用它,而是只在用户暂停输入时才调用它。
在Android上,我只使用Handler类和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
我从我的集团中调用代码如下:
@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()的原因,因为我无法从嵌套函数的块中产生新的状态。
任何帮助都是非常感谢的!
发布于 2019-05-28 16:52:51
您可以通过使用Future实现取消CancelableOperation异步操作。
下面是一个示例(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发布于 2019-05-28 16:07:25
发布于 2019-05-28 16:04:28
假设您使用的是TextField作为输入,您可以在onSubmitted上调用getTranslation(),当用户完成编辑时调用它:
TextField(
onSubmitted: (value) {
getTranslation(value, 'en', 'ru');
},
);https://stackoverflow.com/questions/56345983
复制相似问题