Флаттер Только создать элемент, для которого documentID соответствует String в массиве в Firestore - PullRequest
0 голосов
/ 19 октября 2019

Я все еще новичок в Flutter и Firestore, и у меня возникла проблема, когда я хочу заполнить список только элементами из коллекции "brites", если (и только если) documentID также отображается как String в массиве в другой коллекции Firestore с именем "users"> "bookmarks"> array (содержащей Strings с documentID: s).

Мне трудно узнать, гдеНачать, я полагаю, главным образом из-за моего в настоящее время смутного понимания Firestore и асинхронных потоков и запросов. Может быть, where() или map() - это решение, но то, что является конкретным, сейчас у меня над головой.

List<Widget> populateBriteList(AsyncSnapshot snapshot, int x, bool isBookmarksSection) {
  List<Widget> list = new List<Widget>();

    BriteShowItem _briteContent(j) {
      return BriteShowItem(
        briteID: snapshot.data.documents[j].documentID,
        imagePath: snapshot.data.documents[j]["imagePath"],
        title: snapshot.data.documents[j]["title"],
        author: snapshot.data.documents[j]["author"],
        published: snapshot.data.documents[j]["published"],
        duration: snapshot.data.documents[j]["duration"],
        isBookmarked: snapshot.data.documents[j]["isBookmarked"],
      );
    }

    if (isBookmarksSection) {
      for (int i=0; i<x; i++) {
        //Here only list.add briteContent(i) if the "documentID" in passed in 
        //Snapshot ("brites" collection)
        //is equal to a string in "bookmarks" array in "users" collection
        list.add(
          _briteContent(i)
        );
      }
    } else {
      for (int i=0; i<x; i++) {
        list.add(
          _briteContent(i)
        );
      }
    }
  return list;
}

1 Ответ

0 голосов
/ 20 октября 2019

Итак, одна вещь: когда вы на самом деле создаете виджеты, которые зависят от некоторых данных в хранилище, вам, в конечном счете, уже нужны эти данные. Это не значит, что вы не можете вернуть временное значение, пока ожидаете разрешения будущего. Но в этом случае похоже, что вы вызываете этот метод, как только у вас уже есть данные. Так что, может быть, просто передайте массив закладок также (тем не менее, такой метод с кучей аргументов является хорошим индикатором того, что все выходит из-под контроля и требуются некоторые дополнительные структурные изменения - например, путем разделенияметод в зависимости от условий и при необходимости вызывает различные методы):

List<Widget> populateBriteList(AsyncSnapshot snapshot, int x, bool isBookmarksSection, AsyncSnapshot bookmarkSnapshot) {

...

if (isBookmarksSection) {
  for (int i=0; i<x; i++) {
    if(bookmarkSnapshot.documents.where((document) => condition(document.data)).length > 0){
      list.add(
        _briteContent(i)
      );
    }
  }

В этом случае 'where (someTest)' вызывается в итерируемом списке (документов), каждый элемент передается в someTestметод, и если результат равен true, этот элемент передается в список. Таким образом, если список больше 0, по крайней мере один элемент удовлетворяет этому условию.

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