Я новичок во 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(....);
Ошибка
код для будущего строителя
код для пользовательского интерфейса (здесь я изменил название коллекции)
Как я могу это решить. Я пробовал каждое решение, доступное в Интернете. Спасибо
да какое-то время
убедитесь, что коллекция и условие верны, что вам дает snap.data.documents.length
?
он дает ноль. так как сборка и состояние в порядке
если он дает ноль, то вы ничего не получаете, что вам дает print(itemHolder)
?
он отображает выбранную категорию из предыдущего экрана
Давайте продолжим обсуждение в чате.
Всегда проверяйте результат для будущего построителя, т.е. снимок имеет данные.
Поместите условие переключения или блокировку if-else в зависимости от состояния моментального снимка.
посмотрите пример из официального документа здесь
Да, это имеет. Потому что круговой прогресс не отображается. А также он начинает работать после перезапуска приложения.
Я проверил с блоком переключателей, данные доступны, но все равно возникает та же ошибка.
попробуйте обернуть cart
условием if, чтобы проверить, является ли оно нулевым, прежде чем обращаться к методу checkProductAddedToCart
Откуда ошибка?
Согласно этому, проблема исходит от вашего 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
Да, это сработало. Я использовал ChangeNotifierProvider(create: (c) => CartItemCounter()). Когда я добавил ChangeNotifierProvider.value(value: CartItemCounter()), я начал получать нулевую ошибку по длине. В итоге добавил оба. теперь это работает. Глупо мне это дело заняло 1 целый день. Спасибо тебе, друг..
Эй, это работало нормально, но я не заметил одной вещи: когда я перезапускаю приложение, все данные, хранящиеся в объекте карты, удаляются. Как я могу этого избежать? или как я могу хранить его?
Вам нужно будет сохранить элементы корзины в локальное хранилище устройства и перезагрузить оттуда при запуске приложения. Самый простой и быстрый способ сделать это — плагин Hive. Изучите это.
на экране отображается круглый индикатор прогресса?