【问题标题】:Flutter Firebase get recordIDFlutter Firebase 获取记录 ID
【发布时间】:2021-10-26 20:22:26
【问题描述】:

在下面的代码中,我试图获取 snap 的 id。如果用户点击保存,则应该记录此信息。

但是,我无法获得与所选项目关联的正确 ID。如果你能把我引向正确的方向,那将不胜感激。非常感谢。

Padding(
              padding: const EdgeInsets.fromLTRB(8.0, 3.0, 0.0, 0.0),
              child: StreamBuilder<QuerySnapshot>(
                  stream: FirebaseFirestore.instance
                      .collection('Users')
                      .doc(FirebaseAuth.instance.currentUser.uid)
                      .collection('projects')
                      .snapshots(),
                  builder: (context, snapshot) {
                    if (!snapshot.hasData)
                      const Text("Loading.....");
                    else {
                      List<DropdownMenuItem <Project>> goalItems = [];
                      for (int i = 0; i < snapshot.data.docs.length; i++) {
                         snap = snapshot.data.docs[i];

                       // print (gael.id);
                       // print(snap['project_Name']);
                        goalItems.add(
                          DropdownMenuItem(
                            value: Project(snap['project_Name'], snap.id),//(snap['project_Name'], snap.id),
                            child: SizedBox(
                              width:MediaQuery.of(context).size.width*0.89,
                              child: Text(
                                (snap['project_Name']),
                                style: TextStyle(color: Colors.black),
                              ),
                            ),
                            //  style: TextStyle(color: Color(0xff11b719)),
                            // ),

                          ),
                        );
                      }
                      return Row(
                          children:<Widget> [
                            DropdownButton <Project>(
                              items: goalItems,
                              onChanged: (Project pro) {
                                setState(() {
                                  selectedProject = pro.name;

                                  taskNewValue ['project_Name'] = pro.name ;
                                  taskNewValue['project_ID'] = pro.id;
                                  print(pro.id);
                                });
                              },
                              value: selectedProject,
                              isExpanded: false,
                              hint:  Text(projectName,
                                style: TextStyle(color: Color (0xff29B6F6)), //Color(0xff0d53dc)),
                              ),
                            )]);
                    }
                    return Container(
                      height: 0,width: 0,
                    );
                  }),
            ),
class Project {
 // var User(this.name, this.id);
  final String id;
  final String name;

  Project(this.id,this.name);
}

//最后一次修改完成。当我删除值时,它可以工作,但是当我选择一个新项目时,它不会显示

Padding(
              padding: const EdgeInsets.fromLTRB(8.0, 3.0, 0.0, 0.0),
              child: StreamBuilder<QuerySnapshot>(
                  stream: FirebaseFirestore.instance
                      .collection('Users')
                      .doc(FirebaseAuth.instance.currentUser.uid)
                      .collection('projects')
                      .snapshots(),
                  builder: (context, snapshot) {
                    if (!snapshot.hasData)
                      const Text("Loading.....");
                    else {
                      List<DropdownMenuItem <Project>> goalItems = [];
                      for (int i = 0; i < snapshot.data.docs.length; i++) {
                        snap = snapshot.data.docs[i];
                        print(snap.id);
                        print(snap['project_Name']);

                        goalItems.add(
                          DropdownMenuItem(
                            value: Project(snap.id, snap['project_Name']),
                            //(snap['project_Name'], snap.id),
                            child: SizedBox(
                              width: MediaQuery
                                  .of(context)
                                  .size
                                  .width * 0.89,
                              child: Text(
                                (snap['project_Name']),
                                style: TextStyle(color: Colors.black),
                              ),
                            ),
                            //  style: TextStyle(color: Color(0xff11b719)),
                            // ),

                          ),
                        );
                      }
                      return Row(
                          children: <Widget>[
                            DropdownButton <Project>(
                              items: goalItems,
                              onChanged: (Project pro) {
                                setState(() {
                                  selectedProject = pro.name;
                                  project_ID=pro.id;
                                  myTest = pro.name;
                                  final test4 = Project(project_ID,  myTest);
                                //  print('ID');
                                //  print(pro.id);
                                //  print('name');
                                //  print(pro.name);
                                //  print('test4');
                                //  print(test4.id);
                                //  print(test4.name);
                                 // print(project_ID);
                                });
                              },
                             // value: Project(project_ID,myTest),//selectedProject,
                              isExpanded: false,
                              hint: Text(projectName,
                                style: TextStyle(color: Color(
                                    0xff29B6F6)), //Color(0xff0d53dc)),
                              ),
                            )
                          ]);
                    }
                    return Container(
                      height: 0, width: 0,
                    );
                  }),
            ),

我使用以下代码创建了一个新页面。我收到以下错误。

在构建 StreamBuilder>(脏,依赖项:[MediaQuery],状态:_StreamBuilderBaseState,AsyncSnapshot>>#50df7)时引发了以下 _TypeError: type 'String' 不是 type 'Project?' 的子类型?

我不知道如何解决这个问题。

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

var selectedProject;
var idProject;

DocumentSnapshot snap;

class MyTest extends StatefulWidget {
  const MyTest({Key key}) : super(key: key);

  @override
  _MyTestState createState() => _MyTestState();
}

class _MyTestState extends State<MyTest> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: new AppBar(
        title: new Text('test'),
        actions: <Widget>[
          IconButton(
            icon: Icon(
              Icons.add_circle_outline,
              color: Colors.white,
            ),
            onPressed: () {

            },
          ),
        ],
      ),
      body:

      Padding(
        padding: const EdgeInsets.fromLTRB(8.0, 3.0, 0.0, 0.0),
        child: StreamBuilder<QuerySnapshot>(
            stream: FirebaseFirestore.instance
                .collection('Users')
                .doc(FirebaseAuth.instance.currentUser.uid)
                .collection('projects')
                .snapshots(),
            builder: (context, snapshot) {
              if (!snapshot.hasData)
                const Text("Loading.....");
              else {
                List<DropdownMenuItem <Project>> goalItems = [];
                for (int i = 0; i < snapshot.data.docs.length; i++) {
                  snap = snapshot.data.docs[i];
                  print(snap.id);
                  print(snap['project_Name']);

                  goalItems.add(
                    DropdownMenuItem(
                      value: Project(snap.id, snap['project_Name']),
                      //(snap['project_Name'], snap.id),
                      child: SizedBox(
                        width: MediaQuery
                            .of(context)
                            .size
                            .width * 0.89,
                        child: Text(
                          (snap['project_Name']),
                          style: TextStyle(color: Colors.black),
                        ),
                      ),
                      //  style: TextStyle(color: Color(0xff11b719)),
                      // ),

                    ),
                  );
                }
                return Row(
                    children: <Widget>[
                      DropdownButton <Project>(
                        items: goalItems,
                        onChanged: (Project pro) {
                          setState(() {
                            selectedProject = pro.name;
                            idProject = pro.id;
                           final test4 = Project(idProject,  selectedProject);
                            
                          });
                        },
                         value: selectedProject,
                        isExpanded: false,
                        hint: Text('test',//projectName,
                          style: TextStyle(color: Color(
                              0xff29B6F6)), //Color(0xff0d53dc)),
                        ),
                      )
                    ]);
              }
              return Container(
                height: 0, width: 0,
              );
            }),
      ),
    );
  }
}

class Project {
  // var User(this.name, this.id);
  final String id;
  final String name;

  Project(this.id,this.name);
}

【问题讨论】:

  • 您好,您说“无法获得与所选项目关联的正确 ID”是什么意思。
  • 现在,当我打印 id 时,我总是得到最后一个项目的 id。但我需要选择记录的 id

标签: firebase flutter google-cloud-firestore


【解决方案1】:

你需要使用像Project这样的自定义模型:

class Project {
  const Project(this.name, this.id);    
  final String name;
  final String id;
}

而不仅仅是将字符串名称添加到DropdownButton 项目中,而是添加这些模型:

 List<DropdownMenuItem> goalItems = [];
                      for (int i = 0; i < snapshot.data.docs.length; i++) {
                        DocumentSnapshot snap = snapshot.data.docs[i];
                         test = snapshot.data.docs[i];
                      
                        goalItems.add(
                          DropdownMenuItem(
                            value: Project(snap['project_Name'], snap.id),
                            child: SizedBox(
                              width:MediaQuery.of(context).size.width*0.89,
                              child: Text(
                                (snap['project_Name']),
                                style: TextStyle(color: Colors.black),
                              ),
                            ),

                            //  style: TextStyle(color: Color(0xff11b719)),
                            // ),
                            value: (snap['project_Name']),
                          ),
                        );
                      }

然后您可以从Project 上的onClick 监听器获取id

return Row(
                          children:<Widget> [
                            DropdownButton(
                              items: goalItems,
                              onChanged: (Project pro) {
                                setState(() {
                                  selectedProject = pro;
                                  taskNewValue ['project_Name'] = pro.name ;
                                  taskNewValue['project_ID'] = pro.id;

//here I am trying to get the id of the record, so I can record the id when the user select save
                                });
                              },
                              value: selectedProject,
                              isExpanded: false,
                              hint:  Text(projectName,
                                style: TextStyle(color: Color (0xff29B6F6)), //Color(0xff0d53dc)),
                              ),
                            )]);
                    }

【讨论】:

  • 非常感谢。我会尝试回到你身边。
  • 我已经尝试过,但我收到一条错误消息。我不确定为什么。无法推断类型参数“T”。试图为不起作用的“T”推断“动态”:参数“onChanged”声明为“void Function(T)”,但参数为“Null Function(Project)”。 'dynamic' 类型推断自:参数 'items' 声明为 'List>' 但参数是 'List>'。参数“值”声明为“T”,但参数是“动态”。
  • 你能不能试着把这个List&lt;DropdownMenuItem&gt;改成List<Porject>>
  • 我试过了,但是现在错误已经改变了。错误消息是未为类型“类型”定义运算符“>>”。我不明白我做错了什么。
  • 我找到了错误的根源。但现在我遇到了一个新错误。类型“List>”不是“List>”类型的子类型?我还没有定义 List>。我不知道为什么会收到此错误。非常感谢您的帮助。
猜你喜欢
  • 2021-08-30
  • 2019-08-29
  • 2020-10-10
  • 2020-11-02
  • 2018-09-10
  • 1970-01-01
  • 2019-11-06
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多