![](/img/trans.png)
[英]How do I retrieve a document ID in Firestore after creating a user collection using Flutter
[英]How do I pass a single Firestore document ID to another class based on a selection using Flutter/Dart?
我正在嘗試使用 flutter 設計一個功能,當用戶選擇旅行的縮略圖時,它會將用戶帶到一個頁面,其中包含他們選擇的旅行的更多詳細信息。 我試圖盡可能少地查詢 Firestore 數據庫,因此我試圖從單個查詢快照中獲取文檔 ID 並將其傳遞給 IndividualTripPackage 類。 我已經嘗試了很多方法,但都失敗了。 我還查看了人們在 SO 上發布的其他解決方案,但我無法讓它們適用於我的特定案例。 我究竟做錯了什么? 我是新手,所以如果您對其他方法或更有效的解決方案有想法,我願意接受建議。
TripPackages 類:
class _TripPackagesState extends State<TripPackages> {
@override
Widget build(BuildContext context) {
//Some other code......
child: SingleChildScrollView(
child: StreamBuilder<QuerySnapshot>(
stream:
Firestore.instance.collection('trip_package').snapshots(),
builder: (BuildContext context,
AsyncSnapshot<QuerySnapshot> docSnapshot) {
if (!docSnapshot.hasData) return const Text('Loading...');
final int docCount = docSnapshot.data.documents.length;
return GridView.builder(
shrinkWrap: true,
primary: false,
scrollDirection: Axis.vertical,
itemCount: docCount,
itemBuilder: (_, int index) {
DocumentSnapshot document =
docSnapshot.data.documents[index];
return GestureDetector(
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (_) => IndividualTripPackage(
docID: docSnapshot.data.documents[index]),
),
//Some other code .....
}
}
個人旅行套餐類:
class IndividualTripPackage extends StatefulWidget {
DocumentSnapshot docID;
IndividualTripPackage({this.docID});
@override
_IndividualTripPackageState createState() => _IndividualTripPackageState();
}
class _IndividualTripPackageState extends State<IndividualTripPackage> {
@override
Widget build(BuildContext context) {
final String docID = widget.docID.data['docID'];
return Material(
child: SafeArea(
child: LayoutBuilder(
builder: (BuildContext context, BoxConstraints viewportConstraints) {
return SingleChildScrollView(
child: ConstrainedBox(
constraints: BoxConstraints(minHeight: viewportConstraints.maxHeight),
child: StreamBuilder(
stream: Firestore.instance.collection('trip_package').document('docID').snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Text('Loading data....Please wait...');
} else {
final int itemCount = snapshot.data.document('docID').data['itineraryItems'].length;
return Column(...);
}
}),
//Some more code........
}
}
好吧,我希望這能回答你的問題!
我一直在為我的應用程序使用這樣的方法,它似乎對我有用。 當然,您會希望根據自己的喜好調整類名和其他代碼,但希望這就是您想要做的。
行程縮略圖
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 Stream 的文檔 ID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.