我是扑朔迷离的新手,我想通过调用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
我正在像这样从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()
的原因,因为我将无法从嵌套函数的块中产生新状态。
感谢您的帮助!
答案 0 :(得分:2)
答案 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');
},
);