根据未来设置初始值并响应值更改的正确方法

时间:2019-12-07 17:50:31

标签: flutter dart

我有一个TextFormField中的FutureBuilder,该TextEditingController从设备上的SQLite数据库获取用户数据。

ConnectionState的{​​{1}}为FutureBuilder时,我正在使用done处理其文本,该文本设置为用户对象上的属性。另外,当ConnectionStatedone时,我向控制器添加了一个侦听器,以将用户对象的属性设置为他们在字段中键入的内容。我正在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.我需要在此处进行任何更改以确保我的应用程序尽可能运行吗?

0 个答案:

没有答案