FutureBuilder: вывод, связанный с данными будущего

#flutter

Вопрос:

Что я хочу сделать, так это: если данные загружаются, должен быть возвращен индикатор прогресса. Если данные загружены, но нет значений, должен быть возвращен контейнер с текстом «Keine Spielberichte vorhanden. Если данные загружены и есть значения, то должно быть возвращено представление списка.

На данный момент, если есть данные, то возвращается Контейнер и представление списка..

 return FutureBuilder<BerichtList>(
        future: futureBerichte,
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            //for (var i = 0; i < snapshot.data.berichte.length; i  ) {
            return ListView.builder(
                itemCount: snapshot.data.berichte.length,
                itemBuilder: (context, index) {
                  if (snapshot.data.berichte[index].team == team amp;amp; index > 0) {
                    return Card(
                      shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(15.0)),
                      elevation: 5,
                      color: Colors.white,
                      child: Column(
                        mainAxisSize: MainAxisSize.min,
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: <Widget>[
                          Container(
                            padding: EdgeInsets.symmetric(horizontal: 10),
                            margin: EdgeInsets.symmetric(vertical: 15),
                            child: Text(
                              DateFormat("dd.MM.yyyy HH:mm").format(
                                  DateTime.parse(snapshot
                                      .data.berichte[index].spielDatum)),
                              style: TextStyles.body,
                            ),
                          ),
                          Container(
                            padding: EdgeInsets.symmetric(horizontal: 10),
                            child: Text(
                              snapshot.data.berichte[index].spiele,
                              style: TextStyles.body,
                            ),
                          ),            
                          Container(
                            padding: EdgeInsets.symmetric(horizontal: 10),
                            margin: EdgeInsets.only(bottom: 30),

                            /*   width: 350,
                                      height: 800, */
                            child: Text(
                              snapshot.data.berichte[index].bericht,
                              style: TextStyles.body,
                            ),
                          ),
                        ],
                      ),
                    );
                  } else if (index == 0) {
                    return Container(
                      child: Center(
                        child: Text("Keine Spielberichte vorhanden",
                            style: TextStyles.body),
                      ),
                    );
                  } else
                    return Container();
                });
          } else
            return AppProgressIndicator();
        });
 

Ответ №1:

используйте это, просто всегда возвращайте индикатор выполнения до тех пор, пока не будет выполнена будущая функция, затем проверьте длину данных, если пусто, вернет текст, если нет, список будет построен

 return FutureBuilder<BerichtList>(
        future: futureBerichte,
        builder: (context, snapshot) {
          if (snapshot.connectionState ==
                              ConnectionState.done) {
            if(snapshot.hasData amp;amp; snapshot.data.isNotEmpty)
            //for (var i = 0; i < snapshot.data.berichte.length; i  ) {
            return ListView.builder(
                itemCount: snapshot.data.berichte.length,
                itemBuilder: (context, index) {
                  if (snapshot.data.berichte[index].team == team amp;amp; index > 0) {
                return Card(
                  shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(15.0)),
                  elevation: 5,
                  color: Colors.white,
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: <Widget>[
                      Container(
                        padding: EdgeInsets.symmetric(horizontal: 10),
                        margin: EdgeInsets.symmetric(vertical: 15),
                        child: Text(
                          DateFormat("dd.MM.yyyy HH:mm").format(
                              DateTime.parse(snapshot
                                  .data.berichte[index].spielDatum)),
                          style: TextStyles.body,
                        ),
                      ),
                      Container(
                        padding: EdgeInsets.symmetric(horizontal: 10),
                        child: Text(
                          snapshot.data.berichte[index].spiele,
                          style: TextStyles.body,
                        ),
                      ),            
                      Container(
                        padding: EdgeInsets.symmetric(horizontal: 10),
                        margin: EdgeInsets.only(bottom: 30),

                        /*   width: 350,
                                  height: 800, */
                        child: Text(
                          snapshot.data.berichte[index].bericht,
                          style: TextStyles.body,
                        ),
                      ),
                    ],
                  ),
                );
              }
            })  else  {
                return Container(
                  child: Center(
                    child: Text("Keine Spielberichte vorhanden",
                        style: TextStyles.body),
                  ),
                );
              }  
      } 
        return AppProgressIndicator();
      
    });
 

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

1. К сожалению, это то же самое поведение

Ответ №2:

это может вам помочь.

 return FutureBuilder<BerichtList>(
        future: futureBerichte,
        builder: (context, snapshot) {
         if(!snapshot.hasData){
              return CircularProgressIndicator();
          }
         return snapshot.data!.length == 0 ? Text("Keine Spielberichte vorhanden")
                                          : Listview.builder( // your logic here);
        
        });

 

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

1. Это правильный тест, когда нужно показать CircularProgressIndicator : if (snapshot.connectionState != ConnectionState.done) { return const Center(child: CircularProgressIndicator()); }

2. Это выражение для меня не работает: снимок.данные! .длина