gpt4 book ai didi

dart - 在 Flutter 的循环中添加 TextEditingControllers 不起作用

转载 作者:IT王子 更新时间:2023-10-29 06:57:11 27 4
gpt4 key购买 nike

我尝试实现的是在输入超过 1 个字符后自动验证 TextInputField。

这是我的 initState(简化版):

@override
void initState() {
autoValidateList.addAll([
_autoValidateEmail,
_autoValidateCompanyName,
_autoValidatePhoneNo,
_autoValidateName,
_autoValidateSurname
]);

textEditingControllersList.addAll([
_emailController,
_companyNameController,
_phoneNoController,
_nameController,
_surnameController
]);

for (int i = 0; i < textEditingControllersList.length; i++) {
TextEditingController controller = textEditingControllersList[i];
controller.addListener(() => () {
print(
'Listener entered. companyName? ${controller == _companyNameController}');
if (controller.text.length > 0) {
print('=> true');
setState(() => autoValidateList[i] = true);
} else {
print('=> false');
setState(() => autoValidateList[i] = false);
}
});
}
_emailController.text = widget.loginData.email;
super.initState();
}

如果我不在循环中添加监听器,例如:

_emailController.addListener(() => setState(() {
if (_emailController.text.length > 0) {
_autoValidateEmail = true;
} else {
_autoValidateEmail = false;
}
}));

它工作正常。

没有任何打印语句被执行。我在这里缺少什么?

最佳答案

这里有一个非常隐蔽的错误。请注意,在您的 addListener 中,您正在传递一个返回函数的函数。您要执行的是返回的函数,但实际上您执行的是传递的函数。

在更清晰的语法中,您正在这样做:

controller.addListener(() {
return () {
// Your code
};
});

所以,发生的事情是:

controller.addListener(() {
print('This is going to be executed');
return () {
print('This is NOT going to be executed. Your code used to be here.');
};
});

代替:

controller.addListener(() => () {
...
});

你应该这样做:

controller.addListener(() {
...
});

此外,这不相关,但您应该在 initState 的开头调用 super,而不是在结尾。

关于dart - 在 Flutter 的循环中添加 TextEditingControllers 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56005865/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com