Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 基于未来设置初始值并响应值更改的正确方法_Flutter_Dart - Fatal编程技术网

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;
        ...
    }
}