Как сохранить данные коллекции из firestore в список? - PullRequest
1 голос
/ 01 мая 2020

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

Я определил список как:

List retrievedData = List();

далее, по нажатию кнопки Я хотел напечатать данные во всех документах определенной коллекции c. Итак, я сделал это:

RaisedButton(
        onPressed: () async {

          var collectionReferece = await Firestore.instance.collection('insults');
          collectionReferece.getDocuments().then((collectionSnapshot){
            retrievedData = collectionSnapshot.documents.toList();
          });

          print(retrievedData);
        },

Я ожидаю этого в консоли:

I/flutter (11351): [{index: 200, title: This is a test 1},{index: 100, title: This is a test 2}]

Но я получаю это:

I/flutter (11351): [Instance of 'DocumentSnapshot', Instance of 'DocumentSnapshot']

Кроме того, я просто хочу хранить эти данные в списке или любой другой переменной. Выручи меня. Спасибо.

Редактировать:

Я пытался использовать forEach, но он продолжает добавляться при каждом нажатии кнопки.

Ответы [ 3 ]

2 голосов
/ 01 мая 2020

Если вы хотите:

  1. получить данные из пожарного магазина
  2. добавить в список
  3. создать listview.builder

Тогда Вы можете сделать следующее, сначала объявите следующие переменные в вашем State классе:

class _MyHomePageState extends State<MyHomePage> {
  bool isFirstTime = false;
  List<DocumentSnapshot> datas = List<DocumentSnapshot>();

Затем создайте метод с именем getData(), на который будет ссылаться в onPressed:

      floatingActionButton: FloatingActionButton(
        onPressed: getData,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), 

  getData() async {
    if (!isFirstTime) {
      QuerySnapshot snap =
          await Firestore.instance.collection("insults").getDocuments();
      isFirstTime = true;
      setState(() {
        datas.addAll(snap.documents);
      });
    }
  }

Здесь, на прессе FAB, вы получите данные из коллекции insults. Мы используем логическое значение, чтобы получить только один раз за клик. Внутри метода dispose, который вы переопределяете:

  @override
  void dispose() {
    super.dispose();
    this.isFirstTime = false;
  }
}

Вы можете назначить isFirstTime на false снова. Затем для отображения данных можно использовать свойство body из AppBar, назначить его виджету Center, и виджет Center будет содержать listview:

      body: Center(
        // Center is a layout widget. It takes a single child and positions it
        // in the middle of the parent.
        child: ListView.builder(
          itemCount: datas.length,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text('${datas[index]["index"]}'),
              subtitle: Text('${datas[index]["title"]}'),
            );
          },
        ),

Использование listview.builder, у вас будет список на экране, и вам не нужно будет использовать forEach для итерации списка. Вам просто нужно использовать оператор get [], чтобы получить данные внутри списка.

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

Любой код, которому требуется доступ к данным из Firestore, должен находиться внутри then. Итак:

  var collectionReferece = await Firestore.instance.collection('insults');
  collectionReferece.getDocuments().then((collectionSnapshot){
    retrievedData = collectionSnapshot.documents.toList();
    print(retrievedData);
  });

Но вы, как правило, хотите отделить загрузку данных от метода build() и использовать состояние или FutureBuilder, чтобы получить данные из базы данных в визуализированный вывод. Некоторые примеры этого:

0 голосов
/ 01 мая 2020

Я думаю, это потому, что метод .toList () помещает эти 2 документа в один и тот же тип данных, что и DocumentSnapshot. попробуйте напечатать это, чтобы быть уверенным.

print(retrievedData[0]['title']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...