Не удалось получить документ об использовании where in в flutter firebase (облачный магазин firestore)

# #flutter #dart #google-cloud-firestore #rangeslider

Вопрос:

Я пытаюсь отфильтровать свои товары на основе ценового диапазона, установленного пользователем. Для этого я использую ползунок диапазона, но не получаю никакого продукта в этом диапазоне:- Код для ползунка диапазона:-

 SfRangeSlider(
            min: 0.0,
            max: 20000.0,
            showLabels: true,
            showTicks: true,
            enableTooltip: true,
            values: _values,
            activeColor: Themes.selectedColor,
            inactiveColor: const Color(0xffc0c0c0),
            tooltipTextFormatterCallback: (a, s)=>"₹ $s",
            onChanged: (SfRangeValues newValues) {
              products.removeWhere((element) => element.price!<_values.startamp;amp;element.price!>_values.end);
              if(products.length<8){
                getData();
              }
              setState(() {
                _values = newValues;
              });
            },
          ),
 

и мой код для извлечения данных:-

 void getData()async
  {
    QuerySnapshot snapshot=await productReference.where('category',isEqualTo: widget.category).where("price",whereIn: [_values.start,_values.end]).limit(12).get();
    if(snapshot.docs.isNotEmpty){
      for (DocumentSnapshot doc in snapshot.docs) {
        products.add(ProductModel.fromDocument(doc));
      }
      lastDoc=snapshot.docs.last;
    }
    setState(() {
      loading=false;
      load=false;
    });
  }
 

Но я не могу получить ни одного документа. Даже несмотря на то, что продукт существует в ценовом диапазоне. Для тестирования я выбираю 0 и 20 000 в качестве значения по умолчанию для проверки.

P. S:- Нужно ли мне создавать какой-либо индекс? Если да, то какие для него ценности?

Ответ №1:

whereIn проверяет точное соответствие приведенным вами значениям.

То, что ты хочешь сделать, это:

 QuerySnapshot snapshot = await productReference
    .where('price', isLessThanOrEqualTo: _values.end)
    .where('price', isGreaterThanOrEqualTo: _values.start)
    .limit(12)
    .get();
 

Что касается вашего вопроса об индексах: Если вам нужно его создать, firestore, скорее всего, сообщит вам и даст вам возможность создать его автоматически, чтобы я не беспокоился об этом.

Еще одно примечание: я думаю, что ваш метод извлечения данных вызовет много вызовов в базу данных. Возможно, лучшим решением было бы извлекать данные только тогда, когда пользователь прекращает обновлять значения ползунка. Вот как этого добиться:

 Listener(
  behavior: HitTestBehavior.translucent,
  onPointerUp: (_) {
    // Listen to pointer up and ONLY retrieve data when this happens
    products.removeWhere((element) =>
    element.price! < _values.start amp;amp; element.price! > _values.end);
    if (products.length < 8) {
      getData();
    }
  },
  child: SfRangeSlider(
    min: 0.0,
    max: 20000.0,
    showLabels: true,
    showTicks: true,
    enableTooltip: true,
    values: _values,
    inactiveColor: const Color(0xffc0c0c0),
    tooltipTextFormatterCallback: (a, s) => "₹ $s",
    onChanged: (SfRangeValues newValues) {
      // DON'T fetch the state here, only update the values
      setState(() {
        _values = newValues;
      });
    },
  ),
)
 

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

1. Спасибо, что это сработало. Но можете ли вы сказать, как я могу получить данные при перемещении ползунка, так как в текущей функции функция получения данных выполняется n раз

2. Я не понимаю вашего вопроса. Вы хотите, чтобы ваша функция работала меньше ?

3. да, я хочу, чтобы он запускался только тогда, когда пользователь перестал менять ползунок

4. Я обновил свой комментарий. Я сохранил вашу логику с продуктами. длина В любом случае, у тебя есть идея

5. Спасибо за это, но я нашел немного лучшее решение. Который предназначен для получения данных, когда пользователь перестает перемещать ползунок.