当TextField值更改时,Flutter FutureBuilder刷新

问题描述 投票:0回答:2

_futureData功能中获取值后,FutureBuilder将用于_loadPhobias()

entry_screen.dart

Future _futureData;
final TextEditingController _textEditingController = TextEditingController();

_loadPhobias()函数似乎没有任何问题。

entry_screen.dart

Future<List<String>> _loadPhobias() async =>
    await rootBundle.loadString('assets/phobias.txt').then((phobias) {
    List _listOfAllPhobias = [];
    List<String> _listOfSortedPhobias = [];
    _textEditingController.addListener(() {
    ...................
    }); 
    }
    return _listOfSortedPhobias;
});

@override
void initState() {
super.initState();
    _futureData = _loadPhobias();
}

@override
Widget build(BuildContext context) {
    return Scaffold(
    appBar: AppBar(
    title: TextField(
        // When the value is changed, the value returned from the _loadPhobias will also change. So I want the FutureBuilder to be rebuilt.
        onChanged: (text) { setState(() => _futureData =  _loadPhobias()) },
        ),
    ),
    body: FutureBuilder(
        future: _futureData,
        builder: (context, snapshot) {
            return snapshot.hasData
                ? ListView.builder(
                    itemCount: snapshot.data.length,
                    itemBuilder: (context, index) => Column(
                            children: <Widget>[
                                PhobiasCard(sentence: snapshot.data[index]),
                            )
                        ],
                    ))
                    : Center(
                        child: CircularProgressIndicator(),
                    );
                },
            ),
        ),
    );
}

这是我得到的错误:

FlutterError(setState()回调参数返回了Future。

_ EntryScreenState#51168上的setState()方法是使用返回了Future的闭包或方法来调用的。也许它被标记为“异步”。

而不是在对setState()的调用中执行异步工作,而是先执行工作(不更新窗口小部件状态),然后在对setState()的调用中同步更新状态,]]

_futureData用于从_loadPhobias()函数检索值后用于FutureBuilder。 entry_screen.dart将来的_futureData;最终的TextEditingController _textEditingController = ...

flutter dart flutter-layout flutter-dependencies
2个回答
0
投票

可以在错误消息的第三行中推断出解决方案:


0
投票

首先要注意的是,您提到要在每次文本更改时都“重建”应用程序。为此,您应该使用StreamBuilderFutureBuilder只能使用一次,就像火灾和遗忘事件或JavaScript中的Promise一样。

© www.soinside.com 2019 - 2024. All rights reserved.