Flutter выдает нулевую ошибку, но работает после перезапуска

#firebase #flutter #google-cloud-firestore #stream-builder #flutter-futurebuilder

# #огневая база #трепетание #google-облако-firestore #построитель потоков #flutter-futurebuilder

Вопрос:

Я новичок в Flutter, я пытаюсь получить данные из коллекции firestore. Я использую FutureBuilder с провайдером, но он показывает нулевую ошибку при запуске и отлично работает после перезапуска приложения.

Вот код для извлечения данных:

                 FutureBuilder<QuerySnapshot>(
                    future: FirebaseFirestore.instance
                        .collection(collec.collectionProducts)
                        .get(),
                  builder: (context, snapshot) {
                    return Consumer<CartItemCounter>(
                      builder: (BuildContext context, CartItemCounter cart, _) {
                        if (cart.checkProductAddedToCart(model.productId)) {
                          return Row(....);
 

Ошибка
ошибка-изображение

код для futurebuilder код виджета

код для пользовательского код виджета пользовательского интерфейсаинтерфейса (здесь я изменил имя коллекции)

Как я могу это решить. Я перепробовал все решения, доступные в Интернете. Спасибо

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

1. отображается ли на экране circularprogressindicator?

2. да, некоторое время

3. убедитесь, что коллекция и условие where верны, что вам snap.data.documents.length дает?

4. он выдает null. поскольку сбор и условие в порядке

5. если он дает null, то вы ничего не получаете, что же print(itemHolder) вам это дает?

Ответ №1:

Откуда берется ошибка?

В соответствии с этим проблема исходит от вас Consumer<CartItemCounter> .

Что означает эта ошибка?

Эта ошибка, The method 'x' was called on null. , означает, что класс, в котором записана эта x функция, этот класс равен null.

В чем причина этой ошибки в моем коде?

Ваш Consumer<CartItemCounter> предоставляет экземпляр CartItemCounter по имени cart . Затем вы вызываете функцию checkProductAddedToCart .

В сообщении об ошибке сообщается, что cart значение null, которое выдается вам Consumer виджетом. Это означает, что потребитель, вероятно, также не нашел этого поставщика. Я ожидаю, что должен быть журнал ошибок Provider , сообщающий вам, что CartItemCounter не найден.

Возможное решение

Попробуйте «предоставить» CartItemCounter.

Как вы это делаете? Перейдите в верхнюю часть дерева виджетов вашего приложения, чтобы MaterialApp , оберните его внутри MultiProvider или ChangeNotifierProvider , а затем передайте свой новый CartItemCounter как value .

Ознакомьтесь с Официальными документами поставщика для получения дополнительной информации о том, как предоставить информацию о поставщике.

Вам необходимо загрузить полный журнал, чтобы я мог вам помочь.

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

1. ChangeNotifierProvider(create: (c) => CartItemCounter()), Да, я уже добавил поставщика в main.dart

2. Да, это сработало. Я использовал ChangeNotifierProvider(create: (c) => CartItemCounter()). Когда я добавил ChangeNotifierProvider.value(значение: CartItemCounter()), я начал получать нулевую ошибку по длине. В конце я добавил оба. теперь это работает. Глупо, что для меня это заняло 1 целый день. Спасибо, приятель..

3. Эй, это сработало нормально, но я не заметил одной вещи: когда я перезапускаю приложение, все данные, хранящиеся в Map object, удаляются. Как я могу этого избежать? или как я могу его сохранить?

4. Вам нужно будет сохранить элементы корзины в локальном хранилище устройства и перезагрузить оттуда при запуске приложения. Самый простой и быстрый способ сделать это — плагин Hive. Изучите это.

Ответ №2:

Всегда проверяйте результат для будущего сборщика, т.Е. У моментального снимка есть данные.

Установите условие переключения или блокировку if-else в зависимости от состояния моментального снимка.

проверьте пример из официального документа здесь

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

1. Да, это так. Потому что циклический прогресс не отображается. А также он начинает работать после перезапуска приложения.

2. Я проверил с помощью switch block, данные доступны, но все равно появляется та же ошибка

3. попробуйте обернуть ваше cart значение условием if, чтобы проверить, является ли оно нулевым, прежде чем обращаться к методу checkProductAddedToCart