flutter - 在 firestore 中显示具有动态添加字段的子集合时出现问题
问题描述
我制作了一个患者列表,其中包含一个结帐子集合(我的语言中的 pregledi),当医生使用日期作为字段名称和结帐作为值进行结帐时,该子集合会动态填充。这是一个功能
_addField(String fieldName, String description, String id){
FirebaseFirestore.instance.collection('pacijenti')
.doc(id).collection('pregledi').doc(id).
set({
fieldName: description
},SetOptions(merge: true));}
我遇到的问题是当我单击患者姓名时如何显示所有结帐的列表。我尝试创建一个不同的页面,但这是一个死胡同,因为我无法获取数据,因为我缺少唯一的字段名称(因为每个结帐在添加时的名称都不同)。抱歉,如果我的问题不清楚,这是我的第一个问题。这是更多源代码,以及我尝试做的事情。
我的结帐页面
class _ChecksScreenState extends State<ChecksScreen> {
final Color primaryColor = Color(0xff18203d);
final Color secondaryColor = Color(0xff232c51);
final Color logoGreen = Color(0xff25bcbb);
TextEditingController dateCheckController = TextEditingController();
TextEditingController checkoutController = TextEditingController();
List<dynamic> checkouts = [];
getPatient() async {
QuerySnapshot querySnapshot = await FirebaseFirestore.instance
.collection('pacijenti')
.doc(FieldPath.documentId.toString()).collection('pregledi').get();
var response = querySnapshot.docs;
return response;
}
@override
void initState() {
getPatient().then((data) {
setState(() {
checkouts = data;
});
});
super.initState();
}
CollectionReference ref = FirebaseFirestore.instance.collection('pacijenti').doc(FieldPath.documentId.toString()).collection('pregledi');
late DocumentSnapshot documentSnapshot;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Pregledi",
style: GoogleFonts.openSans(color: Colors.white, fontSize: 32)),
backgroundColor: Colors.transparent,
elevation: 0,
actions: [
IconButton(icon: Icon(Icons.note_add_rounded, size: 32),
onPressed: (){
showDialog(
context: context,
builder: (context) => Dialog(
child: Container(
padding: EdgeInsets.all(20),
color: primaryColor,
child: ListView(
shrinkWrap: true,
children: <Widget> [
_buildTextField(dateCheckController, "Datum"),
SizedBox(height: 20),
_buildTextField(checkoutController, "Pregled"),
SizedBox(height: 20),
MaterialButton(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Text(
'Dodaj pregled',
style: TextStyle(
color: Colors.white
),
),
) ,
color: logoGreen,
onPressed: () {
_addField(dateCheckController.text, checkoutController.text, ref.id);
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => ChecksScreen()),
(route) => false);
},
),
],
),
),
),
);
},
),
IconButton(icon: Icon(Icons.folder_open_rounded, size:32),
onPressed: () {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => ListScreen()),
(route) => false);
}),
SizedBox(width: 10,),
],
),
backgroundColor: primaryColor,
body: Container(
padding: EdgeInsets.all(8.0),
child: checkouts.length > 0
? ListView.builder(
itemCount: checkouts.length,
itemBuilder: (BuildContext context, int index){
return GestureDetector(
onTap: () {
Navigator.of(context).pushNamed(Checkout.routeName,
arguments: checkouts[index]);
},
child: ListTile(
title: Container(
child:
Text(checkouts[index][dateCheckController.text],
style: TextStyle(color: Colors.white, fontSize: 20),
),
),
),
);
},
): Center(
child: CircularProgressIndicator(),
),
),
);
}
问题是我试图显示每个结帐,但集合中的每个字段都有不同的名称,因为用户正在动态添加结帐字段。我尝试使用用于添加结帐的 dateCheckController 来做到这一点,但我知道这不是可行的解决方案。我应该为该控制器分配字符串名称并尝试获取这样的字段吗?我很困惑。
解决方案
推荐阅读
- windows - 我们如何构建一个 windows / WCF 服务来启动 OSCOVA Bot 的 WEB API 通道
- c# - 在 C# 中使用文件路径可视化文件字典的最佳实践
- angular - 是否可以将 angular7 组件或服务中的数据传递给 index.html 文件?
- listview - Xamarin.forms - ListView 和键盘之间的故障行为
- excel - 从 Google 表格脚本中解析 Excel 文件中的数据
- kubernetes - 为什么这个 Manifest 创建的 Pod 可以在不指定 Nodeselector 的情况下部署到 GPU Worker
- c# - 使用 ASP.NET 核心 MVC/Razor 站点和 WebAPI 进行授权
- node.js - Express 无法在 NodeJS 应用程序中使用 Typescript
- reactjs - TSX:阅读子孙的道具
- scala - 将sbt项目移动到新机器时如何避免重新下载sbt依赖包