android - Flutter onChange 执行了两次
问题描述
我有一个文本字段,它有onChange属性,当它检测到文本有\n执行一个函数时,问题是这个函数执行了两次,应该提到的是,在那个函数中,我清理了文本的文本控制器。
TextField(
maxLines: null,
controller: codigoController,
autofocus: true,
onChanged: (text) {
if (text.contains('\n')) {
test();
}
},
),
_test() {
print("hello");
codigoController.clear();
}
解决方案
解决方案之一是listener
使用TextController
1. 添加监听器
我们可以在第一次渲染屏幕时添加监听器。稍后我们需要按照文档的说明处理它
class _AutoCallApiState extends State<AutoCallApi> {
TextEditingController codigoController = TextEditingController();
@override
void initState() {
super.initState();
codigoController.addListener(changesOnField);
}
@override
void dispose() {
codigoController.dispose(); // release unused memory in RAM
super.dispose();
}
2.处理变更和API调用
Future callApi(String textToSent) async {
await Future.delayed(Duration(seconds: 5));
print("Received OK from API");
codigoController.clear();
}
void changesOnField() {
print("Changes Called");
String text = codigoController.text;
if (text.isNotEmpty) {
print('$text');
if (text.contains('\n')) {
callApi(text);
}
}
}
3. 演示
callApi 方法只调用一次
注意:您可能会在演示中看到,它只打印一次“Saved data to API”
4. 完整回购
你可以查看这个 repo 并在本地构建它。Github
推荐阅读
- wpf - 工具提示初始延迟在 WPF 中不起作用?
- java - 来自 try 块和 try-with-resources 的异常
- asp.net - 在 .NET Lambda API 中为 Swashbuckle swagger.json 启用 COR
- regex - 使用正则表达式将字符串包含到另一个字符串中
- json - 在巨大的 .ndjson 文件上验证(并报告错误!)的最快方法是什么?
- javascript - 如何从此函数中提取凭证?
- c# - 2D 角色在 Unity 中粘在墙上
- c# - C# 内存到 TextReader
- git - GitVersion:在发布拉取请求后,您如何增加主分支的版本?
- python - 生成图像,然后将其显示在烧瓶上