首页 > 解决方案 > 在 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 来做到这一点,但我知道这不是可行的解决方案。我应该为该控制器分配字符串名称并尝试获取这样的字段吗?我很困惑。

我想显示但没有唯一名称的字段

标签: fluttergoogle-cloud-firestore

解决方案


推荐阅读