我有一个TextFormField
中的FutureBuilder
,该TextEditingController
从设备上的SQLite数据库获取用户数据。
当ConnectionState
的{{1}}为FutureBuilder
时,我正在使用done
处理其文本,该文本设置为用户对象上的属性。另外,当ConnectionState
为done
时,我向控制器添加了一个侦听器,以将用户对象的属性设置为他们在字段中键入的内容。我正在FutureBuilder
中而不是在initState
中这样做,因为那时数据还不存在。
我想知道这是否是一种合理的方法吗?
Class EditProfileScreenState扩展了状态{ 最终_tagOneController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
body: FutureBuilder(
future: _userFuture,
builder: (_, userData) {
switch (userData.connectionState) {
....
case ConnectionState.done:
if (!newUser.containsKey('firstName')) {
newUser = Map<String, dynamic>.from(userData.data);
_tagOneController.text = newUser['tagOne'];
_tagOneController.value = _tagOneController.value.copyWith(text: newUser['tagOne']);
_tagOneController.addListener(() {
setState(() {
newUser['tagOne'] = _tagOneController.text;
});
_determineSuggestedTags(1, _tagOneController.text); // creates dropdown of suggested tags
});
}
return ....other widgets....
}
}
)
)
此后,当用户更改字段中的文本时,小部件将根据我在其他数据库中的内容生成建议标签的下拉列表。当用户点击建议的标签之一时,我正在更改控制器的text属性的值以及用户对象上该属性的值,如下所示:
_addTag(number, tag) {
switch (number) {
case 1:
setState(() {
newUser['tagOne'] = tag;
tagOneController.text = newUser['tagOne'];
suggestedTags = [];
});
break;
...
}
}
这就是我想知道的:
1.是否可以像我一样在FutureBuilder
中将侦听器添加到控制器中?
2.是否可以像上面一样在方法中设置_tagOneController.text
?
3.我需要在此处进行任何更改以确保我的应用程序尽可能运行吗?