J'utilise un plugin pour flutter appelé search_widget
. Le paramètre data de ce widget prend une liste. Mais comme j'utilise sqlite
pour récupérer des données, je les ai sous la forme Future<List>
. Est-il possible de convertir Future<List>
en List
? Ou tout autre moyen de faire fonctionner cela.
6 Réponses :
Future<List> _fetchList() {...}
en supposant que c'est votre fonction de retour dataList () qui est Futur:
List yourlist = new List(); dataList().then((resultat){ setState(() => yourlist.add(resultat); });
En empruntant l'exemple de search_widget, vous avez besoin de dataList
dans un widget comme celui-ci:
FutureBuilder<List<Leaderboard>>( future: _sqliteCall(), builder: (context, snapshot) { if (snapshot.hasData) { return SearchWidget<LeaderBoard>( dataList: snapshot.data, textFieldBuilder: (TextEditingController controller, FocusNode focusNode) { return MyTextField(controller, focusNode); }, ) } return CircularProgressIndicator(); } ),
Bien sûr, vous pouvez convertir Future<List>
en List
comme le suggèrent d'autres réponses. Mais vous ne pourrez pas faire dataList: await _sqliteCall();
car les méthodes de build
sont conçues pour être pures et symétriques.
Pendant que le futur se termine, vous devrez renvoyer quelque chose comme un indicateur de progression. Pour cela, vous pouvez utiliser un FutureBuilder
:
SearchWidget<LeaderBoard>( dataList: list, textFieldBuilder: (TextEditingController controller, FocusNode focusNode) { return MyTextField(controller, focusNode); }, )
Bien sûr, cela peut également être fait avec un StatefulWidget
, vous pouvez consultercet article pour une explication détaillée du problème .
En utilisant await
mot - clé attendra l' avenir pour se remplir et une fois que votre avenir est exécuté résultat de ce sera retourné.
import 'dart:async'; void main() async { Future<List> _futureOfList = _getList(); List list = await _futureOfList ; print(list); // will print [1, 2, 3, 4] on console. } Future<List> _getList(){ return Future.value([1,2,3,4]); }
pour que cela fonctionne, la méthode que vous appelez doit être async
J'espère que cela aide, en cas de doute, veuillez commenter.
C'est ainsi que j'ai résolu le problème ...
Version initiale:
@override List<Product> getAll() { List<Product> _listProducts; _repo.getAll().then((value) { if (value != null) value.forEach((item) => _listProducts.add(item)); }); return _listProducts == null ? [] : _listProducts; }
Nettoyé / version finale:
@override List<Product> getAll() { List<Product> _listProducts; Future<List<Product>> listFuture; listFuture = _repo.getAll(); listFuture.then((value) { if (value != null) value.forEach((item) => _listProducts.add(item)); }); return _listProducts == null ? [] : _listProducts; }
List<Future<dynamic>> _selectedItems = List<Future<dynamic>>(); List<dynamic> listofimg = []; _selectedItems.forEach((element) { element.then((value) => listofimg.add(value)); });
Bienvenue dans StackOverflow. Bien que ce code puisse résoudre la question, inclure une explication sur comment et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre publication et entraînerait probablement plus de votes à la hausse. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement à la personne qui la pose maintenant. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limites et des hypothèses applicables.