#firebase #flutter #dart #google-cloud-firestore
#firebase #флаттер #dart #google-cloud-firestore
Вопрос:
Мне было интересно, как я могу отобразить более одного документа, связанного с одним и тем же ПОЛЬЗОВАТЕЛЬСКИМ UID
На данный момент мое приложение отображает только один документ PDF
что я могу сделать, чтобы отобразить более одного документа одного и того же пользователя??? Я не понимаю, как должна работать эта логика, возможно ли это сделать без SQL?
Я знаю только, как получить один документ, используя пользовательский идентификатор.
мой код:
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
FirebaseFirestore firestore = FirebaseFirestore.instance;
FirebaseAuth auth = FirebaseAuth.instance;
int _currentIndex = 0;
@override
Widget build(BuildContext context) {
final User user = auth.currentUser;
final uid = user.uid;
final tabs = [
Center(
child: (Scaffold(
body: FutureBuilder(
future: FirebaseFirestore.instance
.collection('users')
.doc(uid)
.get(),
builder: (context, AsyncSnapshot snapshot) {
if (snapshot.data == null)
return CircularProgressIndicator();
DocumentSnapshot manuais = snapshot.data;
if (snapshot.hasData) {
print('ok');
print(manuais.data()['nome']);
} else {
print('nopeeeee');
}
return Container(
padding: EdgeInsets.all(16),
child: ListView.builder(
itemCount : 1,
itemBuilder: (context, index) {
DocumentSnapshot manuais = snapshot.data;
return Card(
color: Colors.grey[250],
child: Container(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: <Widget>[
new Image.asset(
'Images/pdflogo.png',
width: 32,
),
Center(
child: Text(
(manuais.data()['nome'].toString()),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 16),
),
),
ButtonBar(
children: <Widget>[
FlatButton(
child: const Text(
'Compartilhar / Download'),
onPressed: () async {
var request = await HttpClient()
.getUrl(Uri.parse(manuais
.data()['documento']));
var response =
await request.close();
Uint8List bytes =
await consolidateHttpClientResponseBytes(
response);
await Share.file(
'ESYS AMLOG',
'Manual.pdf',
bytes,
'image/jpg');
}),
],
),
],
),
),
);
}),
);
})))),
Ответ №1:
У вас не может быть нескольких документов с одинаковым идентификатором в одной коллекции: идентификатор документа должен быть уникальным для всей коллекции.
В вашем случае, если я правильно понимаю, у вас может быть вложенная коллекция для каждого user
документа, например
-- users (collection)
-- DTB2.... (user document)
-- pdfDocs (subcollection)
-- JH8766ng.... (pdf document, with auto-generated ID)
fields: nome: "PDF1", creationDate: ..., author: .... (for example)
-- 65rt6b8H.... (pdf document, with auto-generated ID)
fields: nome: "PDF2", creationDate: ..., author: ....
Вы бы запросили все документы с:
FirebaseFirestore.instance
.collection('users')
.doc(uid)
.collection('pdfDocs')
.get();
который возвращает a QuerySnapshot
.
Комментарии:
1. большое вам спасибо, поэтому, используя вложенную коллекцию, я могу отображать более одного документа для каждого пользователя.
2. Я изменил FirebaseFirestore.instance как вы показали, теперь я получаю тип ‘QuerySnapshot’ не является подтипом типа ‘DocumentSnapshot’ знаете, что еще мне нужно изменить, чтобы отобразить вложенную коллекцию?
3. Взгляните на документ: firebase.flutter.dev/docs/firestore/usage#одноразовое чтение
4. Круто, рад, что смог помочь!