7

は、関数から値を取得_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() の呼び出し内で状態を同期的に更新します。

4

2 に答える 2