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

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

Вот код для получения данных:

                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(....);

Ошибка

код для будущего строителя

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

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

на экране отображается круглый индикатор прогресса?

Peter Haddad 23.12.2020 07:45

да какое-то время

Arvina Kori 23.12.2020 07:52

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

Peter Haddad 23.12.2020 07:55

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

Arvina Kori 23.12.2020 07:56

если он дает ноль, то вы ничего не получаете, что вам дает print(itemHolder)?

Peter Haddad 23.12.2020 07:56

он отображает выбранную категорию из предыдущего экрана

Arvina Kori 23.12.2020 07:57

Давайте продолжим обсуждение в чате.

Peter Haddad 23.12.2020 07:57
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
1
7
410
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

Arvina Kori 23.02.2021 10:50

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

Arvina Kori 23.02.2021 18:56

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

kenn 24.02.2021 11:05
Ответ принят как подходящий

Откуда ошибка?

Согласно этому, проблема исходит от вашего Consumer<CartItemCounter>.

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

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

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

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

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

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

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

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

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

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

ChangeNotifierProvider(create: (c) => CartItemCounter()), Да, я уже добавил Provider в main.dart

Arvina Kori 24.02.2021 11:34

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

Arvina Kori 24.02.2021 11:53

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

Arvina Kori 05.03.2021 16:11

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

hysabone.com 09.03.2021 11:48

Другие вопросы по теме