Как искать и отображать результаты из поля массива в облачном хранилище во флаттере? - PullRequest
0 голосов
/ 31 марта 2020

Логика c, стоящая за моей функцией поиска, в поле searchKey хранится первая буква значения с заглавной буквы. По сути, я буду хранить любое значение с помощью searchKey; это значения Первая буква заглавная и хранится в новом поле с именем SearchKey.

Я хотел отобразить результаты поиска из массива в Cloud Firestore. Код, который я написал для строкового поля, работает отлично. Вот оно:

void initiateSearch(String val) async {
if (val.length == 0) {
  setState(() {
    queryResultSet = [];
    tempSearchStore = [];
    queryResultGigSet = [];
    tempSearchGigStore = [];
    queryResultTagSet = [];
    tempSearchTagStore = [];
  });
}

String capitalizedValue =
    val.substring(0, 1).toUpperCase() + val.substring(1);
    if (queryResultGigSet.length == 0 && val.length == 1) {
  // SearchService().searchByName(val);

  await databaseReference
      .collection('posts')
      .where('searchKey', isEqualTo: val.substring(0, 1).toUpperCase())
      .getDocuments()
      .then((QuerySnapshot docs) {
    for (int i = 0; i < docs.documents.length; ++i) {
      setState(() {
        isLoading = false;
        queryResultGigSet.add(docs.documents[i].data);
      });
    }
  });
} else {
  tempSearchGigStore = [];
  queryResultGigSet.forEach((element) {
    if (element['category'].startsWith(capitalizedValue)) {
      setState(() {
        isLoading = false;
        tempSearchGigStore.add(element);
      });
    }
  });
}

Но для массива это не работает. Код, который я написал:

    if (queryResultTagSet.length == 0 && val.length == 1) {
  // SearchService().searchByName(val);

  await databaseReference
      .collection('posts')
      .where('searchKeyTags', arrayContains: val.substring(0, 1).toUpperCase())
      .getDocuments()
      .then((QuerySnapshot docs) {
    for (int i = 0; i < docs.documents.length; ++i) {
      setState(() {
        isLoading = false;
        queryResultTagSet.add(docs.documents[i].data);
      });
    }
  });
} else {
  tempSearchTagStore = [];
  queryResultTagSet.forEach((element) {
    if (element['tags'].values.startsWith(capitalizedValue)) {
      setState(() {
        isLoading = false;
        tempSearchTagStore.add(element);
      });
    }
  });
}
}
 }

1 Ответ

1 голос
/ 01 апреля 2020

ответ

    if (queryResultTagSet.length == 0 && val.length == 1) {
  // SearchService().searchByName(val);

  await databaseReference
      .collection('posts')
      .where('searchKeyTags',
          arrayContains: val.substring(0, 1).toUpperCase())
      .getDocuments()
      .then((QuerySnapshot docs) {
    for (int i = 0; i < docs.documents.length; ++i) {
      setState(() {
        isLoading = false;
        queryResultTagSet.add(docs.documents[i].data);
      });
    }
  });
} else {
  tempSearchTagStore = [];
  queryResultTagSet.forEach((element) {
     List.from(element['tags']).forEach((p) {
      if (p.toString().startsWith(capitalizedValue)) {
        setState(() {
          isLoading = false;
          tempSearchTagStore.add(element);
        });
      }
    });
  });
}
...