En _futureData
est à utiliser pour le FutureBuilder
après avoir récupéré la valeur du _loadPhobias()
fonction.
écran_d'entrée.dart
Future _futureData;
final TextEditingController _textEditingController = TextEditingController();
_loadPhobias()
ne semble pas avoir de problème.
écran_d'entrée.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(),
);
},
),
),
);
}
Voici l'erreur que j'ai obtenue :
FlutterError (l'argument de la callback setState() a renvoyé un Future.
La méthode setState() de _EntryScreenState#51168 a été appelée avec une fermeture ou une méthode renvoyant un Future. Elle est peut-être marquée comme "async".
Au lieu d'effectuer un travail asynchrone à l'intérieur d'un appel à setState(), exécutez d'abord le travail (sans mettre à jour l'état du widget), puis mettez à jour l'état de manière synchrone à l'intérieur d'un appel à setState()).