Flutter 基于未来设置初始值并响应值更改的正确方法
我有一个Flutter 基于未来设置初始值并响应值更改的正确方法,flutter,dart,Flutter,Dart,我有一个TextFormField,它位于FutureBuilder中,从设备上的SQLite数据库获取用户数据 当FutureBuilder的ConnectionState完成时,我使用TextEditingController来处理设置为用户对象上属性的文本。另外,当连接状态完成时,我将向控制器添加一个侦听器,以将用户对象的属性设置为他们在字段中键入的内容。我在FutureBuilder中执行此操作,而不是在initState中,因为此时数据还不存在 我想知道这样做是否合理 类EditPro
TextFormField
,它位于FutureBuilder
中,从设备上的SQLite数据库获取用户数据
当FutureBuilder
的ConnectionState
完成时,我使用TextEditingController
来处理设置为用户对象上属性的文本。另外,当连接状态
完成时,我将向控制器添加一个侦听器,以将用户对象的属性设置为他们在字段中键入的内容。我在FutureBuilder
中执行此操作,而不是在initState
中,因为此时数据还不存在
我想知道这样做是否合理
类EditProfileScreenState扩展了状态{
final _tagOneController=TextEditingController()
我想知道的是:
1.可以像我一样在FutureBuilder
中将侦听器添加到控制器中吗?
2.可以像我上面所做的那样设置\u tagOneController.text
?
3.为了确保我的应用程序尽可能运行良好,我是否应该在此处进行任何更改?一般来说,最好不要将逻辑放入构建方法中。由于构建方法可以在任何时候出于任何原因被调用,我建议将您的逻辑分为不同的方法,并将所需的数据作为参数传递。此外,您的TextFormFields l在哪里位于FutureBuilder中?@BenjaminS.你能举个例子说明你在说什么吗?
return…other widget…
返回一个ListView
,这会导致TextFormFields
,正如Ben所说的,你不应该使用FutureBuilder
作为一个可以添加逻辑的地方:而是使用Future
API(或async/await
)要做到这一点是的,它会再次执行,我只是做了一个快速测试
@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....
}
}
)
)
_addTag(number, tag) {
switch (number) {
case 1:
setState(() {
newUser['tagOne'] = tag;
tagOneController.text = newUser['tagOne'];
suggestedTags = [];
});
break;
...
}
}