Как ссылаться на documentID Firestore в Flutter FutureBuilder - PullRequest
0 голосов
/ 16 мая 2019

У меня есть рабочий код, который получает коллекцию («песни») из Firestore, используя Future и QuerySnapshot. У меня есть это в небольшой функции getSongs (). Пока я в этой функции, у меня есть доступ к идентификаторам документов ... поэтому, если я позвоню, скажем:

печать (songsQuery.documents [1] .documentID);

Я получаю -LSvpZxM2pUIYjjp0qby

Но позже в своем коде я использую FutureBuilder, где я вызываю getSongs () для будущего, а затем создаю ListView с фрагментами информации о песне (Artist, Title и т. Д.) Из снимка в построителе:.

Пока я нахожусь в этом виджете, я не могу понять, как ссылаться на мой .documentID больше. Я могу получить все элементы .data для каждого документа ... но не фактический documentID.

Есть ли что-то очень очевидное, чего мне не хватает?

Спасибо за любую помощь.

ER

Я искал интернет, пытаясь решить безуспешно. Кажется, что многие люди берут список документов, загружают их в массив, добавляют doc.id, помещают все это в массив элементов. Тогда используйте предметы. Я хотел бы просто использовать снимки, полученные от Firestore, и ссылаться на doc.id напрямую, если это возможно.

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';

class AllSongs extends StatelessWidget {
Future getSongs() async {
  var firestore = Firestore.instance;
  QuerySnapshot songsQuery = await      firestore.collection('songs').getDocuments();

print(songsQuery.documents[1].documentID); 
//Here I can get to documentID...

return songsQuery.documents;
}
  @override
  Widget build(BuildContext context) {
    return Center(
      child: FutureBuilder(
        future: getSongs(),
        builder: (_, songSnapshots){

      print('How do I reference the DocumentID in here?');
      print(songSnapshots.data.length);
      print(songSnapshots.data[0].data['title']);
      //print(songSnapshots.data[0].documentID);
      //print(songSnapshots.data[0].ref);
      //print(songSnapshots.data[0].data[ DOCUMENTID?? ]);

      if(songSnapshots.connectionState == ConnectionState.waiting){
        return Center(
          child: Text('Loading...'),
        );
      } else {
        return ListView.builder(
          itemCount: songSnapshots.data.length ,
          itemBuilder: (_, index){
            return ListTile(
            title: Text(songSnapshots.data[index].data['title']),
            subtitle: Text(songSnapshots.data[index].data['artist']),
            );
        });
      }
    },
  )

);
}
}

1 Ответ

0 голосов
/ 16 мая 2019

Вы пытаетесь получить доступ к значению значения будущего, прежде чем оно разрешится.

Попробуйте добавить следующую строку:

if (!songSnapshots.hasData) {
    // Future hasn't resolved
    return something;
}
// Future has resolved, you can access your data (including documentId)

Ваше будущее разрешается в списке DocumentSnapshotтак что просто дождитесь разрешения будущего, и у вас должен быть доступ ко всем вашим данным.В качестве альтернативы, вы можете попытаться получить доступ к этому в своем операторе else, когда состояние соединения не ожидает, но в этом случае вы рассматриваете любые состояния без ожидания как успешные, поэтому я рекомендую использовать свойство hasData AsyncSnapshot класс вместо.

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