web-dev-qa-db-fra.com

Comment attendre le futur objet avant de procéder au flottement?

J'écris un code en flutter dans lequel j'utilise une base de données SQFlite. Je veux insérer un widget d'image à partir des actifs et j'obtiens le nom de l'image à partir de la base de données.

    @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("Single Line diagram"),backgroundColor: Colors.red.shade700,),
      body: SingleChildScrollView(
        scrollDirection: Axis.horizontal,
        child: Align(
          //alignment: Alignment.center,
          child: SingleChildScrollView(
            scrollDirection: Axis.vertical,
            child: Row(
              //crossAxisAlignment: CrossAxisAlignment.center,
              children: imageList(),
            ),
          ),
        )
      ),
    );
  }

Le code ci-dessus appelle imageList () pour la liste des images à afficher.

List<Widget> imageList(){
    List<Widget> singleLineImages = new List();
    List unit;
    for (int i = 0; i <= widget.unitsList.length-1; i++){
      for (int j = 1; j <= int.parse(widget.unitsList[i].quantity); j++){
        print("${widget.unitsList[i].bulletin}, ${widget.unitsList[i].mountType}, ${widget.unitsList[i].disconnect}");
        getfileName(widget.unitsList[i].bulletin, widget.unitsList[i].mountType, widget.unitsList[i].disconnect);
        //if(fileName != null) {
          singleLineImages.add(
              Image.asset("images/SD_Files_2100/$fileName.jpg", height: 400.0, width: 200.0,));
        //}
      }
    }
    return singleLineImages;
  }

J'obtiens le nom de fichier de la méthode getFileName () qui utilise la base de données.

getfileName(String bulletin, String mountType, String disconnect)async {
    fileNameList = await db.getSDfileName(bulletin, disconnect, mountType);
    fileName = fileNameList[0]['FileName'];
    print("filename: $fileName");
  }

Maintenant, après avoir appelé getFileName (), le programme n'attend pas le fileName et continue plus loin, ce qui prend filename as null. Le nom de fichier est obtenu correctement après le code Image.asset. Existe-t-il un moyen pour que le programme attende jusqu'à ce qu'il obtienne le nom de fichier approprié?

4
Keshav

Commencez à récupérer la liste dans initState() et appelez setState lorsque la liste est récupérée, pour le faire de manière asynchrone. Vous trouverez ci-dessous un exemple simplifié de ce processus. Notez également l'instruction d'attente avant d'obtenir le nom de fichier. Cela garantit que vous revenez à ce morceau de code une fois l'exécution terminée.

class ListPage extends StatefulWidget {
  @override
  _ListPageState createState() => _ListPageState();
}

class _ListPageState extends State<ListPage> {
  // This should actually be a List<MyClass> instead of widgets. 
  List<Widget> _list;

  @override
  void initState() {
    super.initState();
    _fetchList();
  }

  Future _fetchList() async {
    List<Widget> singleLineImages = new List();
    List unit;
    for (int i = 0; i <= widget.unitsList.length-1; i++){
      for (int j = 1; j <= int.parse(widget.unitsList[i].quantity); j++){
        print("${widget.unitsList[i].bulletin}, ${widget.unitsList[i].mountType}, ${widget.unitsList[i].disconnect}");
        String fileName = await getfileName(widget.unitsList[i].bulletin, widget.unitsList[i].mountType, widget.unitsList[i].disconnect);
      singleLineImages.add(
          Image.asset("images/SD_Files_2100/$fileName.jpg", height: 400.0, width: 200.0,));
      }
    }

    // call setState here to set the actual list of items and rebuild the widget.
    setState(() {
      _list = singleLineImages;
    });
  }

  @override
  Widget build(BuildContext context) {
    // Build the list, or for example a CircularProcessIndicator if it is null.
  }
}

Sidenote: vous faites beaucoup d'appels à la base de données, ce qui est probablement inefficace. Essayez d'obtenir les données requises en un seul appel db. Mais c'est un autre sujet.

5
Jesse de Wit