Конструктор элементов не запускается в futurbuilder Flutter

#flutter #flutter-layout #flutter-futurebuilder

#флаттер #флаттер-макет #flutter-futurebuilder

Вопрос:

 Scaffold(body: FutureBuilder(
      future: fetchTracks(),
      builder: (BuildContext context, AsyncSnapshot snapshot){

     if(snapshot.hasData)
     {
        ListView.builder(
    scrollDirection: Axis.vertical,
    itemExtent: 130.0,
    physics: AlwaysScrollableScrollPhysics(),
    shrinkWrap: true,
    itemCount: trackes.length,
    itemBuilder: (BuildContext context, int index) {
      print("test");
      return makeCard(snapshot.data[index]);
    },
  ).build(context);
     }
     else
     {
       return Center(child: new CircularProgressIndicator());
     }

    } ));
  

Когда я вызываю этот каркас, будущая сборка вызовет мою будущую функцию fetchTracks() и получит данные в snapshot, но они не входят в функцию itemBuilder. Таким образом, futurebuilder возвращает NULL.
Пожалуйста, помогите мне решить. и заранее благодарю вас

Ответ №1:

Вы пропускаете return перед ListView.builder . Если вы не вернете его, он не будет его создавать.

Комментарии:

1. Большое вам спасибо.

Ответ №2:

FutureBuilder имеет разные состояния подключения к моментальному снимку, которые вы должны обрабатывать. Данные в потоке недоступны до тех пор, пока ConnectionState не станет равным done, а hasData — true.

 _loadData(context)
 {
   showModalBottomSheet(
   context: context,
   builder: (BuildContext bc){ 
    return FutureBuilder(
    future: fetchTracks(),
    builder: (BuildContext context, AsyncSnapshot<List<MyClass>> snapshot){
        if (snapshot.connectionState!=ConnectionState.done)
        {
            return PleaseWaitWidget();
        }
        else if(snapshot.hasError)
        {
            DialogCaller.showErrorDialog(context,"future builder  has an error").then((value){});
        }
        else if (snapshot.connectionState==ConnectionState.done)
        {
          if(snapshot.hasData){ 

              List<Widget> list = snapshot.data.map((MyClass myClass){
                return Card(
        child:Wrap(children:<Widget>[
                  Row(children: [Text(myClass.field1)],),
               ]));}).toList();

              return list;
          }
        }
    });
   });
  }