База огня Флаттера получает рекордИД

# #firebase #flutter #google-cloud-firestore

Вопрос:

В приведенном ниже коде я пытаюсь получить идентификатор snap. Эта информация должна быть записана позже, если пользователь нажмет на кнопку Сохранить.

Но я не могу получить правильный идентификатор, связанный с выбранным проектом. Если вы сможете направить меня в нужное русло, я буду признателен. Большое спасибо.

 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,
                    );
                  }),
            ),
 

Я создал новую страницу со следующим кодом. Я получаю следующую ошибку.

Следующая ошибка _TypeError была вызвана при построении StreamBuilder<QuerySnapshot<Объект?><Объект?>>(грязно, зависимости: [MediaQuery], состояние: _StreamBuilderBaseState<Объект?>><QuerySnapshot<Объект?>, AsyncSnapshot<Объект?><QuerySnapshot<Объект?><Объект?>><Объект? > > #50df7): тип «Строка» не является подтипом типа » Проект?»

Я не знаю, как это исправить.

 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);
}

 

Комментарии:

1. Привет, что вы имеете в виду, когда говорите, что «не можете получить правильный идентификатор, связанный с выбранным проектом».

2. прямо сейчас, когда я печатаю идентификатор, я всегда получаю идентификатор последнего проекта. Но мне нужно получить идентификатор выбранной записи

Ответ №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']),
                          ),
                        );
                      }
 

Затем вы можете получить id Project информацию от onClick слушателя:

 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)),
                              ),
                            )]);
                    }
 

Комментарии:

1. Большое спасибо. Я постараюсь вернуться к тебе.

2. Я пытался, но получаю сообщение об ошибке. Я не уверен, почему. Не удалось определить параметр типа «T». Попытался вывести «динамический» для «T», который не работает: параметр «OnChanged» объявлен как » Функция void(T)», но аргумент » Нулевая функция(проект)». Тип «динамический» был выведен из: Параметр «элементы» объявлен как » Список<Выпадающий список<T><T>>», но аргумент » Список<T>><Выпадающий список<динамический><динамический>>». Параметр «значение» объявлен как «T», но аргумент «динамический».

3. Не могли бы вы, пожалуйста, попытаться изменить это List<DropdownMenuItem> на список <Porject>>

4. Я пробовал, но теперь ошибка изменилась. Сообщение об ошибке заключается в том, что оператор «> > > «не определен для типа «Тип». Я не понимаю, что я делаю не так.

5. Я нашел причину ошибки. Но теперь я получаю новую ошибку. тип «Список<Раскрывающийся список<динамический><динамический>>» не является подтипом типа «Список<динамический>><Раскрывающийся список<Проект><Проект>>?» Я не определил список<Проект>><Раскрывающийся список<динамический><динамический>>. Я не знаю, почему я получаю эту ошибку. Большое спасибо за вашу помощь.