Firebase 如何访问一个特定文档(在firestore中)以在颤振列表互动程序中执行ontap操作后显示
我有一个firestore集合(国家),我只需要在按下互动程序后显示其中的一个文档,但无论我在ontap函数中写什么,都会给我带来各种错误。我该怎么办? 这是我的密码Firebase 如何访问一个特定文档(在firestore中)以在颤振列表互动程序中执行ontap操作后显示,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我有一个firestore集合(国家),我只需要在按下互动程序后显示其中的一个文档,但无论我在ontap函数中写什么,都会给我带来各种错误。我该怎么办? 这是我的密码 import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:cloud_firestore/cloud_firestor
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:vola1/pageShow.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:async/async.dart';
class test extends StatelessWidget {
const test({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder(
stream: FirebaseFirestore.instance
.collection('countries')
// .doc('nW9L4LGpn2MZVyiTyUII')
.snapshots(),
builder: (context, AsyncSnapshot<QuerySnapshot> querySnapshot) {
if (querySnapshot.hasError) return Text('has some error');
if (querySnapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else {
// if (!snapshot.hasData) return Text('Loading data.. please wait..');
final list = querySnapshot.data.docs;
return ListView.builder(
itemBuilder: (context, index) {
return Container(
child: ListTile(
title: Text(list[index]['name']),
subtitle: Text(list[index]['description']),
contentPadding: EdgeInsets.all(20),
leading: Image.network(
list[index]['image'],
height: 200,
width: 80,
),
onTap: () => {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => pageShow(list[index]),
),
),
},
),
color: Colors.orangeAccent,
);
},
itemCount: list.length,
);
}
},
),
appBar: AppBar(
centerTitle: true,
backgroundColor: Color.fromRGBO(255, 111, 82, 0.8),
),
);
}
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:vola1/pageShow.dart”;
导入“包:firebase_core/firebase_core.dart”;
导入“包:async/async.dart”;
类测试扩展了无状态小部件{
常量测试({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:StreamBuilder(
流:FirebaseFirestore.instance
.收款(“国家”)
//.doc('nW9L4LGpn2MZVyiTyUII')
.snapshots(),
生成器:(上下文,异步快照查询快照){
if(querySnapshot.hasError)返回文本('hassomerror');
if(querySnapshot.connectionState==connectionState.waiting){
返回循环ProgressIndicator();
}否则{
//如果(!snapshot.hasData)返回文本('正在加载数据..请稍候..');
最终列表=querySnapshot.data.docs;
返回ListView.builder(
itemBuilder:(上下文,索引){
返回容器(
孩子:ListTile(
标题:文本(列表[索引][“名称]),
字幕:文本(列表[索引][说明]),
内容填充:边缘集。全部(20),
领先:Image.net(
列表[索引]['image'],
身高:200,
宽度:80,
),
onTap:()=>{
导航器。推(
上下文
材料路线(
生成器:(上下文)=>pageShow(列表[索引]),
),
),
},
),
颜色:Colors.orangeacent,
);
},
itemCount:list.length,
);
}
},
),
appBar:appBar(
标题:对,
背景颜色:颜色。来自RGBO(255、111、82、0.8),
),
);
}
}
这是我导航到的页面的代码
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:async/async.dart';
class pageShow extends StatelessWidget {
const pageShow(list(index), {Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder(
stream: FirebaseFirestore.instance.collection('countries').get(),
builder: (context, snapshot) {
if (!snapshot.hasData) return Text('Loading data.. please wait..');
return Column(
children: <Widget>[
Text(
snapshot.data['name'],
style: TextStyle(fontSize: 20),
),
Text(
snapshot.data['description'],
style: TextStyle(fontSize: 20),
),
Text(
snapshot.data['cuisine'],
style: TextStyle(fontSize: 20),
),
Text(
snapshot.data['tradition'],
style: TextStyle(fontSize: 20),
)
],
);
},
),
appBar: AppBar(
centerTitle: true,
backgroundColor: Color.fromRGBO(255, 111, 82, 0.8),
),
);
}
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“package:flatter/widgets.dart”;
导入“包:cloud_firestore/cloud_firestore.dart”;
导入“包:firebase_core/firebase_core.dart”;
导入“包:async/async.dart”;
类pageShow扩展了无状态小部件{
constpageshow(list(index),{Key}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:StreamBuilder(
流:FirebaseFirestore.instance.collection('countries').get(),
生成器:(上下文,快照){
如果(!snapshot.hasData)返回文本('正在加载数据..请稍候..');
返回列(
儿童:[
正文(
snapshot.data['name'],
样式:TextStyle(字体大小:20),
),
正文(
snapshot.data['description'],
样式:TextStyle(字体大小:20),
),
正文(
snapshot.data['courine'],
样式:TextStyle(字体大小:20),
),
正文(
snapshot.data['tradition'],
样式:TextStyle(字体大小:20),
)
],
);
},
),
appBar:appBar(
标题:对,
背景颜色:颜色。来自RGBO(255、111、82、0.8),
),
);
}
}
按下互动程序后,我希望它显示firestore中特定文档的所有内容。这将非常简洁。您好,在获取单个文档时,您不需要使用.snapshots()。您可以尝试下面的代码。此外,我建议将文档ID保留为小写的国家名称,以便您可以使用下面的查询
FirebaseFirestore.instance
.collection('countries')
.doc("countryName")
.get()
.then((DocumentSnapshot documentSnapshot) {
if (documentSnapshot.exists) {
print('Document data: ${documentSnapshot.data()}');
//Set the relevant data to variables as needed
} else {
print('Document does not exist on the database');
}
});
这是另一个样品
但是,如果不希望国家名称作为文档ID,则必须将国家名称作为字段存储在文档中(由于查询区分大小写,因此首选小写)。然后您可以提出如下请求:
FirebaseFirestore.instance
.collection('countries')
.where('countryName', isEqualTo: "theCountryNameUserClickedOn")
.get()
确保在Firestore中的文档中添加countryName字段。实际上,我想在用户点击互动程序后显示文档的所有内容现在只有两个文档,但我将在其中添加更多,我只是不知道如何显示与特定国家/地区ontap相关的数据。是否创建一个新页面,然后在ontap中将导航器推送到该页面?但它展示了所有文件的每一个细节,我不希望发生这种情况。你能帮个忙吗?@KalyaniMalokar我不明白。你能分享一个样本输出吗?我的意思是,您正在尝试根据文档中某个字段的值获取文档。但是只有一个匹配的文档?正如你在应用程序界面图片中看到的,我有两个国家,这些国家的数据存储在firestore的一个集合中的两个不同文档中,现在的问题是,当我点击包含国家图片和描述的互动程序时,我希望它打开一个新页面,显示该国家特定文档中的数据@Dharmaraj@KalyaniMalokar你能分享完整文档的截图吗?您需要一个包含国家名称的字段。@KalyaniMalokar我已经更新了答案。如果有帮助,请告诉我。