Flutter получает данные из firestore в виде списка - PullRequest
0 голосов
/ 05 мая 2020

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

Эта функция ниже будет извлекать данные из firestore и возвращать некоторые выбранные поля в виде списка.

Future<List> getNewsOnSearchBar() async {
  final String _collection = 'news';
  final Firestore _fireStore = Firestore.instance;
  var newsList = [];

  print("1");

  Future<QuerySnapshot> getData() async {
    print("2");
    return await _fireStore.collection(_collection).getDocuments();
  }

  QuerySnapshot val = await getData();
  if (val.documents.length > 0) {
    print("3");
    for (int i = 0; i < val.documents.length; i++) {
      newsList.add(val.documents[i].data["headline"]);
    }
  } else {
    print("Not Found");
  }
  print("4");
  return newsList;
}

А ниже моя строка поиска widget. Он имеет атрибут searchList типа List<dynamic>. Он принимает такие значения, как:

var list = ["a", "b", "c"];

searchList: list

Поэтому я хочу вызвать эту функцию выше getNewsOnSearchBar() и установите в список атрибут searchList. Я пробовал ниже, но это не сработало.


Widget _showSearchBar(BuildContext context) {
  return FutureBuilder(
      future: getNewsOnSearchBar(),
      builder: (BuildContext context, AsyncSnapshot snapshot) {
        if (snapshot.hasError || !snapshot.hasData) {
          return _progressIndicator();
        } else {
          return GFSearchBar(

            searchList: [], //how can I assign the list return from `getNewsOnSearchBar()` here?
            searchQueryBuilder: (query, list) {
              return list
                  .where((item) =>
                      item.toLowerCase().contains(query.toLowerCase()))
                  .toList();
            },
            overlaySearchListItemBuilder: (item) {
              return Container(
                padding: const EdgeInsets.all(3),
                child: Text(
                  item,
                  style: const TextStyle(fontSize: 18),
                ),
              );
            },
            onItemSelected: (item) {},
          );
        }
      });
}

Не могли бы вы мне помочь, пожалуйста?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Поскольку ваша функция getNewsOnSearchBar () возвращает список, вы можете использовать snapshot.data. поэтому ваша функция становится примерно такой

return GFSearchBar(
        searchList: snapshot.data,
        searchQueryBuilder: (query, list) {
          return list
              .where((item) =>
                  item.toLowerCase().contains(query.toLowerCase()))
              .toList();
        },
0 голосов
/ 05 мая 2020

Сделать это можно двумя способами. 1 - вы можете получить документы для firebase, а затем использовать функцию Map для создания списка. 2-Вы можете создать Firebase Functions для извлечения информации, как вы ожидаете.

...