Firestore, где запрос не может изменить условие во время выполнения - PullRequest
0 голосов
/ 08 января 2020

Я работаю над приложением Flutter и использую Firebase в качестве бэкэнда. Я также использую Firestore в качестве базы данных.

У меня проблема с тем, что я хочу отфильтровать какой-либо элемент на основе выбора пользователя. Я определил переменную filteredCategory в моем DataService и тут же создал сеттер.

void setFilteredCategory(String category) {
    filteredCategory = category;
}

Затем я вызвал этот сеттер из виджета фильтра

DataService().setFilteredCategory(category);

Но в методе where() ничего не изменилось , Это просто проигнорировало изменение.

Stream<dynamic> get getItems {
    return items
        .document(uid)
        .collection("items")
        .where("category", isEqualTo: filteredCategory)
        .snapshots()
        .map(_snapshotToUserData);
  }

Я также попытался установить эту переменную через некоторое время, используя метод sleep(), и этот подход сработал, поэтому я не знаю, что здесь не так. У вас есть предложения?

Спасибо.

Ответы [ 3 ]

1 голос
/ 08 января 2020

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

void setFilteredCategory(String category) {
  setState((){
    filteredCategory = category;
  });
}

Если результат не соответствует ожидаемому, вы можете полностью переместить запрос из части виджета и передать его самому состоянию.

0 голосов
/ 22 апреля 2020

Попробуйте каждый раз создавать новый экземпляр items, например:

Stream<dynamic> get getItems {
return Firestore.instance.collection("foo").document(uid).collection("items")
    .where("category", isEqualTo: filteredCategory)
    .snapshots()
    .map(_snapshotToUserData);
0 голосов
/ 08 января 2020

Чтобы обновить поток, который использует StreamBuilder, вы должны поместить DataService().setFilteredCategory(category); в setState вызов

setState((){
  DataService().setFilteredCategory(category);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...