4
votes

Comment convertir Future <List> en liste en flutter?

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.


0 commentaires

6 Réponses :


2
votes
Future<List> _fetchList() {...}

0 commentaires

0
votes

en supposant que c'est votre fonction de retour dataList () qui est Futur:

 List yourlist = new List();
   dataList().then((resultat){
          setState(() => yourlist.add(resultat); 
        });


0 commentaires

1
votes

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 .


0 commentaires

1
votes

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.


0 commentaires

0
votes

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;
  }


0 commentaires

0
votes
 List<Future<dynamic>> _selectedItems = List<Future<dynamic>>();
    List<dynamic> listofimg = [];
                                    _selectedItems.forEach((element) {
                                      element.then((value) => listofimg.add(value));
                                    });

1 commentaires

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.