Как отобразить список из Firestore в конструкторе предметов - PullRequest
0 голосов
/ 27 января 2019

Метод getIngredients (), приведенный ниже, возвращает список из firestore.

Future getIngredients() async {
    return Firestore.instance
        .collection('ingredients')
        .where("name", isEqualTo: widget.dish_name.toString().toLowerCase()).getDocuments();
  }

Теперь я хочу отобразить этот список в конструкторе элементов ниже:

 new ListView.builder(
                  itemExtent: 90,
                  itemCount: snapshot.data.length,
                  itemBuilder: (BuildContext context, int index) {
                      return SingleIngredient(
                        ingredient_name: snapshot.data[index].ingredients,
                      );
                  });

Я получаю следующее сообщение об ошибке:

_FutureBuilderState # 7cbda): I / flutter (12164): класс 'QuerySnapshot' не имеет экземпляра getter 'length'.I / flutter (12164): получатель: экземпляр 'QuerySnapshot' I / flutter (12164): пробный вызов: длина

Вот схема моего пожарного депо.Я получаю список ингредиентов:

enter image description here

ОБНОВЛЕНИЕ Я обновил код, но я толькополучить первый элемент из списка ингредиентов (например, лук).Я хочу, чтобы itembuilder создавал каждый элемент в списке, потому что я пытаюсь отобразить изображение и список ингредиентов.Это то, что делает виджет SingleIngredient.Итак, как я могу просмотреть каждый список по очереди?

 Widget build(BuildContext context) {
    return Container(
      child: FutureBuilder(
          future: getIngredients(),
          builder: (context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                itemCount: snapshot.data.documents.length,
                itemBuilder: (context, index) {
                  DocumentSnapshot user = snapshot.data.documents[index];

                  return SingleIngredient(
                    // Access the fields as defined in FireStore
                    ingredient_name: user.data['ingredients'][index].toString(),
                  );
                },
              );
            } else if (snapshot.connectionState == ConnectionState.done &&
                !snapshot.hasData) {
              // Handle no data
              return Center(
                child: Text("No users found."),
              );
            } else {
              // Still loading
              return CircularProgressIndicator();
            }
          }),
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Вот пример использования StreamBuilder, где я извлекаю все документы из коллекции и строю ListView, чтобы показать их:

Widget buildUserList(BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
    if (snapshot.hasData) {
        return ListView.builder(
            itemCount: snapshot.data.documents.length,
            itemBuilder: (context, index) {
                DocumentSnapshot user = snapshot.data.documents[index];

                return ListTile(
                    // Access the fields as defined in FireStore
                    title: Text(user.data['firstName']),
                    subtitle: Text(user.data['lastName']),
                );
            },
        );
    } else if (snapshot.connectionState == ConnectionState.done && !snapshot.hasData {
        // Handle no data
        return Center(
            child: Text("No users found."),
        );
    } else {
        // Still loading
        return CircularProgressIndicator();
    }
}

Использование:

Scaffold(
    body: StreamBuilder(
        stream:
            Firestore.instance.collection('users').snapshots(),
        builder: buildUserList,
    )
)

или

Scaffold(
    body: FutureBuilder(
        future:
            Firestore.instance.collection('users').getDocuments(),
        builder: buildUserList,
    )
)
0 голосов
/ 27 января 2019

Дарт не знает, какой тип вы возвращаете из Будущего, поэтому он интерпретирует его как динамический объект, на котором нет получателя длины.Измените свой метод

Future getIngredients() async {
return Firestore.instance
    .collection('ingredients')
    .where("name", isEqualTo: widget.dish_name.toString().toLowerCase()).getDocuments();

}

На

Future<List<YourType>> getIngredients() async {
return Firestore.instance
    .collection('ingredients')
    .where("name", isEqualTo: widget.dish_name.toString().toLowerCase()).getDocuments();

}

Где YourType - это тип, возвращаемый изфункция getDocuments ().Возможно, вам также понадобится сделать toList () для него.

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