Flutter FutureBuilder возвращает нулевую ошибку

#flutter

Вопрос:

Я использую FutureBuilder для отображения значений из базы данных в графическом интерфейсе. Проблема в том, что я получаю нулевую ошибку до того, как будут показаны значения. Я пытался решить эту проблему с помощью вызова ConnectionState, но это не работает.

Вот мой код до сих пор:

 return FutureBuilder<TerminList>(
        future: mainTermine,
        builder: (context, snapshot) {
          print(snapshot.data.termine[0].postTitle);
          switch (snapshot.connectionState) {
            case ConnectionState.none:
              return Text('No Connection');
            case ConnectionState.active:
            case ConnectionState.waiting:
              return AppProgressIndicator();
            case ConnectionState.done:
              return ListView.builder(
                  itemCount: snapshot.data.termine.length,
                  shrinkWrap: true,
                  physics: NeverScrollableScrollPhysics(),
                  itemBuilder: (context, index) {
                    return Container(
                      margin: EdgeInsets.all(10),
                      decoration: BoxDecoration(),
                      child: Card(
                        shape: RoundedRectangleBorder(
                          borderRadius: BorderRadius.circular(15),
                        ),
                        elevation: 5,
                        color: Colors.white,
                        child: GroovinExpansionTile(
                          boxDecoration: BoxDecoration(
                            borderRadius: BorderRadius.circular(15),
                          ),
                          backgroundColor: Colors.white,
                          leading: Text(
                            snapshot.data.termine[index].metaValue,
                            style: TextStyles.placeholder,
                          ),
                          title: Text(
                            snapshot.data.termine[index].postTitle,
                            style: TextStyles.body,
                          ),
                          children: [
                            Column(
                              children: [
                                Padding(
                                  padding: EdgeInsets.all(10),
                                  child: AppDivider(),
                                ),
                              ],
                            )
                          ],
                        ),
                      ),
                    );
                  });
              return null;
            default:
              return Text('none');
          }
        });
 

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

1. Удалите эту строку печати(снимок.данные.окончание[0].Заголовок);

2. Большое спасибо!

Ответ №1:

Во-первых, вам не нужны нижеприведенные строки, потому что, используя переключатель, вы рассмотрели все сценарии.

             return null;
            default:
              return Text('none');
 

и удалите нижеприведенную строку, потому что вы пытаетесь получить данные до завершения будущих процессов.

 print(snapshot.data.termine[0].postTitle);
 

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

1. спасибо вам за вашу помощь 🙂

Ответ №2:

Я бы использовал snapshot.hasError и snapshot.hasData вместо snapshot.connectionState этого . Это могло бы выглядеть примерно так. (Не уверен, правильно ли я поставил все скобки.)

 return FutureBuilder<TerminList>(
    future: mainTermine,
    builder: (context, snapshot) {
      if (snapshot.hasError) {
        return Text('error while fetching data');
      }
      if (snapshot.hasData) {
          return ListView.builder(
              itemCount: snapshot.data.termine.length,
              shrinkWrap: true,
              physics: NeverScrollableScrollPhysics(),
              itemBuilder: (context, index) {
                return Container(
                  margin: EdgeInsets.all(10),
                  decoration: BoxDecoration(),
                  child: Card(
                    shape: RoundedRectangleBorder(
                      borderRadius: BorderRadius.circular(15),
                    ),
                    elevation: 5,
                    color: Colors.white,
                    child: GroovinExpansionTile(
                      boxDecoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(15),
                      ),
                      backgroundColor: Colors.white,
                      leading: Text(
                        snapshot.data.termine[index].metaValue,
                        style: TextStyles.placeholder,
                      ),
                      title: Text(
                        snapshot.data.termine[index].postTitle,
                        style: TextStyles.body,
                      ),
                      children: [
                        Column(
                          children: [
                            Padding(
                              padding: EdgeInsets.all(10),
                              child: AppDivider(),
                            ),
                          ],
                        )
                      ],
                    ),
                  ),
                );
              }
            );
          }
          return AppProgressIndicator();
        }
     );