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
我是 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