Хорошо, я надеюсь, что это ответит на ваш вопрос!
Я использовал такой метод для своего приложения, и, похоже, он работает для меня. Конечно, вы захотите настроить имена классов и другой код по своему вкусу, но, надеюсь, это то, что вы пытаетесь сделать.
Миниатюра поездки
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:my_test_project/screens/detail.dart';
class Thumbnail extends StatefulWidget {
@override
State<StatefulWidget> createState() => _ThumbnailState();
}
class _ThumbnailState extends State<Thumbnail> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
automaticallyImplyLeading: false,
title: Text(
'Thumbnail'
),
),
body: ListView(
children: <Widget>[
StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('trips').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) return Text('Error: ${snapshot.error}');
if (!snapshot.hasData) return Container(
child: Center(
child: CircularProgressIndicator()
),
);
return Column(
children: snapshot.data.documents.map((doc) {
return GestureDetector(
onTap: () {
var docId = doc.documentID;
Navigator.push(context, MaterialPageRoute(builder: (context) => Detail(docId)));
},
child: Container(
child: Image(
image: NetworkImage(
doc.data['photo']
),
),
),
);
}).toList(),
);
},
)
],
)
);
}
}
Сведения о поездке
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class Detail extends StatefulWidget {
final docId;
Detail(this.docId);
@override
State<StatefulWidget> createState() => _DetailState(docId);
}
class _DetailState extends State<Detail> {
final docId;
_DetailState(this.docId);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'Detail'
),
),
body: ListView(
children: <Widget>[
StreamBuilder<DocumentSnapshot>(
stream: Firestore.instance.collection('trips').document(docId).snapshots(),
builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.hasError) return Text('Error: ${snapshot.error}');
if (!snapshot.hasData) return Container(
child: Center(
child: CircularProgressIndicator()
),
);
return Column(
children: <Widget>[
Container(
child: Text(
snapshot.data['title'],
style: TextStyle(
fontSize: 24.0
),
),
),
Container(
child: Image(
image: NetworkImage(
snapshot.data['photo']
),
),
),
Container(
child: Text(
snapshot.data['body']
)
)
],
);
},
)
],
),
);
}
}
По сути, я передаю переменную на следующий экран с идентификатором документа для использования в потоке DocumentSnapshot.