#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(....);
код для пользовательского интерфейса (здесь я изменил имя коллекции)
Как я могу это решить. Я перепробовал все решения, доступные в Интернете. Спасибо
Комментарии:
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