Я хочу быстро разработать банковское приложение. Но я получаю эту ошибку: оператор проверки на нулевое значение, используемый для нулевого значения. Я попробовал "стабильный канал флаттера", но он не работал, а также попробовал '!' оператор (как вы можете видеть в коде), но он не работает ... :(

Пожалуйста, помогите мне .. Примечание: виджет контейнера очень длинный, поэтому я не стал копировать ..

  Widget projectWidget() {
        return FutureBuilder<List<Histories>>(
            future: dbHelper.getHistories(),
            builder: (context, snapshot) {
              if (snapshot.hasData && snapshot.data!.length > 0) return Container();
              return ListView.builder(
                itemCount: snapshot.data!.length,
                itemBuilder: (context, index) {
                  Histories histories = snapshot.data![index];
                  return Container();
                },
              );
            });
      }
1
Berfin Gürz 15 Сен 2021 в 10:45

2 ответа

Лучший ответ

У вас проблема с вашим оператором if, и таким образом вы пытаетесь получить доступ к данным, когда они еще не существуют, попробуйте что-то вроде этого

return FutureBuilder<List<Histories>>(
        future: dbHelper.getHistories(),
        builder: (BuildContext context, AsyncSnapshot<List<Histories>> snapshot) {
          if (snapshot.connectionState == ConnectionState.done)  {
            return ListView.builder(
                itemCount: snapshot.data!.length,
                itemBuilder: (context, index) {
                  Histories histories = snapshot.data![index];
                      return Container();
                },
              );
          } else if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          } else {
            print('error');
            return Text('error');
          }
        });

Или вы можете заменить это if (snapshot.connectionState == ConnectionState.done) своим оператором if, подобным этому

return FutureBuilder<List<Histories>>(
        future: dbHelper.getHistories(),
        builder: (BuildContext context, AsyncSnapshot<List<Histories>> snapshot) {
          if (snapshot.hasData && snapshot.data!.length > 0)  {
            return ListView.builder(
                itemCount: snapshot.data!.length,
                itemBuilder: (context, index) {
                  Histories histories = snapshot.data![index];
                      return Container();
                },
              );
          } else if (snapshot.connectionState == ConnectionState.waiting) {
            return Center(child: CircularProgressIndicator());
          } else {
            print('error');
            return Text('error');
          }
        });
1
user10433291 15 Сен 2021 в 08:22

Внутри построителя условие else неверное. С текущим кодом, даже если снимок не имеет данных, он попытается вызвать snapshot.data!.length, что вызывает нулевую ошибку.

Widget projectWidget() {
        return FutureBuilder<List<Histories>>(
            future: dbHelper.getHistories(),
            builder: (context, snapshot) {
              if (snapshot.hasData && snapshot.data!.length > 0) 
              return ListView.builder(
                itemCount: snapshot.data!.length,
                itemBuilder: (context, index) {
                  Histories histories = snapshot.data![index];
                  return Container();
                },
              );

               else 
                return Center(child: CircularProgressIndicator());
            });
      }
2
user16593508 15 Сен 2021 в 08:17