Сохраните данные на основе идентификатора пользователя в firebase

# #firebase #flutter #google-cloud-firestore #firebase-authentication

Вопрос:

Я пытаюсь создать приложение для отслеживания финансовых операций. Я выполняю вход для пользователя перед использованием приложения с помощью аутентификации Firebase (это работает). Но я хочу записать данные пользователя на основе идентификатора пользователя. Как я могу это сделать? любой может мне помочь, потому что я новичок во флаттере. Для приведенного ниже кода транзакции хранятся в firebase, но я не основываюсь на идентификаторе пользователя. Я только следую учебнику с Youtube, но я не могу найти учебник на основе идентификатора пользователя, пожалуйста, помогите, спасибо!

 class RecordExpense extends StatefulWidget {
      @override
      _RecordExpenseState createState() => _RecordExpenseState();
    }
    
    class _RecordExpenseState extends State<RecordExpense> {
      DatabaseReference _ref;
      final date = TextEditingController();
      final category = TextEditingController();
      final amount = TextEditingController();
      final description = TextEditingController();
      final FirebaseAuth auth = FirebaseAuth.instance;
      final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
    
      @override
      String selectExpense;
    
      final expenseSelected = TextEditingController();
    
      List <String> expensecategories = [
        "Food",
        "Social Life",
        "Transportation",
        "Beauty",
        "Household",
        "Education",
        "Health",
        "Gift",
        "Other"
      ];
      DateTime _selectedDate;
    
      void initState(){
        _ref = FirebaseDatabase.instance.reference().child('Transaction');
      }
      Widget build(BuildContext context) {
        return new Form(
          child: SingleChildScrollView(
            child: Padding(
              padding: EdgeInsets.all(20.0),
    
              child: Column(
                key: _formKey,
                mainAxisAlignment: MainAxisAlignment.start,
                  children: <Widget>[
                  Container(
                    child : TextField(
                      cursorColor: Colors.grey,
                      controller: date,
                      onTap: () {
                        _selectDate(context);
                      },
                      decoration: InputDecoration(
                        labelText: "Date",
                        labelStyle: TextStyle(fontSize: 18.0, color: Colors.black),
                        hintText: "Select Date",
                        enabledBorder: UnderlineInputBorder(
    
                          borderSide: BorderSide(color: secondary),
                        ),
                        focusedBorder: UnderlineInputBorder(
                          borderSide: BorderSide(color: secondary),
                        ),
                      ),
                    ),
                  ),
                  Container(
                    //padding: EdgeInsets.all(20.0),
                    child: TextField(
                      cursorColor: Colors.grey,
                      controller: amount,
                      decoration: InputDecoration(
                        labelText: "Amount",
                        labelStyle: TextStyle(fontSize: 18.0, color: Colors.black),
                        hintText: "Amount",
                        enabledBorder: UnderlineInputBorder(
    
                          borderSide: BorderSide(color: secondary),
                        ),
                        focusedBorder: UnderlineInputBorder(
                          borderSide: BorderSide(color: secondary),
                        ),
                      ),
                      keyboardType: TextInputType.number,
                    ),
                  ),
                  Container(
                    padding: EdgeInsets.only(top: 20.0),
                    child: Container(
                      decoration: BoxDecoration(
                        border : Border.all(color: secondary),
                        borderRadius: BorderRadius.circular(15.0),
                      ),
                      child: DropDownField(
                        controller: expenseSelected,
                        hintText: "Select Category",
                        labelText: "Category",
                        enabled: true,
                        itemsVisibleInDropdown: 4,
                        items: expensecategories,
                        onValueChanged: (dynamic value)
                        {
                          selectExpense = value;
                        },
                        value: selectExpense,
                        required: false,
                      ),
                    ),
                  ),
    
    
                  Container(
                    //padding: EdgeInsets.all(20,0),
                    child: TextField(
                      cursorColor: Colors.grey,
                      controller: description,
                      maxLines: 2,
                      decoration: InputDecoration(
                        labelText: "Descriptions",
                        labelStyle: TextStyle(fontSize: 18.0, color: Colors.black),
                        hintText: "Expense Description",
                        enabledBorder: UnderlineInputBorder(
    
                          borderSide: BorderSide(color: secondary),
                        ),
                        focusedBorder: UnderlineInputBorder(
                          borderSide: BorderSide(color: secondary),
                        ),
                      ),
                    ),
                  ),
                  Container(
                      padding: EdgeInsets.only(top: 25.0, left: 20.0, right: 20.0),
                      child: Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: <Widget> [
                          Expanded (
                            child: ElevatedButton(
    
                              onPressed: () {
                                saveRecord();
                              },
                              child: Text("Save".toUpperCase(), style: TextStyle (
                                fontSize: 14,
                              )),
                              style: ButtonStyle(
                                padding: MaterialStateProperty.all<EdgeInsets>(EdgeInsets.all(15)),
                                foregroundColor: MaterialStateProperty.all<Color>(Colors.white),
                                backgroundColor: MaterialStateProperty.all<Color>(Colors.pink),
                                shape: MaterialStateProperty.all<RoundedRectangleBorder>(
                                  RoundedRectangleBorder(
                                      borderRadius: BorderRadius.circular(15.0),
                                      side: BorderSide(color: secondary)
                                  ),
                                ),
                              ),
    
                            ),
                          ),
                          SizedBox(width: 20, height: 10),
                          Expanded(
                            child: ElevatedButton(
                              onPressed: () {
                                clearButton();
                              },
                              child: Text("Clear".toUpperCase(), style: TextStyle (
                                  fontSize: 14
                              )),
                              style: ButtonStyle(
                                padding: MaterialStateProperty.all<EdgeInsets>(EdgeInsets.all(15)),
                                foregroundColor: MaterialStateProperty.all<Color>(Colors.white),
                                backgroundColor: MaterialStateProperty.all<Color>(Colors.pink),
                                shape: MaterialStateProperty.all<RoundedRectangleBorder>(
                                  RoundedRectangleBorder(
                                      borderRadius: BorderRadius.circular(15.0),
                                      side: BorderSide(color: secondary)
                                  ),
                                ),
                              ),
                            ),
                          )
                        ],
                      )
                  ),
                ],
              ),
            ),
          ),
        );
      }
      void saveRecord() async {
        User user = await auth.currentUser;
        //DocumentReference documentReference = Firestore.instance.collection("Transaction").document(user.uid);
        String dates = date.text;
        String values = amount.text;
        String descriptions = description.text;
    
        Map<String,String> transaction = {
          'dates':dates,
          'amount': 'RM'  values,
          'category': selectExpense,
          'descriptions': descriptions,
        };
        _ref.push().set(transaction).then((value) {
          Navigator.pop(context, TransactionDaily());
        });
      }
      void clearButton(){
        date.clear();
        amount.clear();
        category.clear();
        description.clear();
      }
      void dispose(){
        super.dispose();
        date.dispose();
        amount.dispose();
        category.dispose();
        description.dispose();
      }
      _selectDate(BuildContext context) async {
        DateTime newSelectedDate = await showDatePicker(
            context: context,
            initialDate: _selectedDate != null ? _selectedDate : DateTime.now(),
            firstDate: DateTime(2000),
            lastDate: DateTime(2040),
            builder: (BuildContext context, Widget child) {
              return Theme(
                data: ThemeData.dark().copyWith(
                  colorScheme: ColorScheme.dark(
                    primary: secondary,
                    onPrimary: Colors.black,
                    surface: primary,
                    onSurface: Colors.white,
                  ),
                  dialogBackgroundColor: Colors.black,
                ),
                child: child,
              );
            });
    
        if (newSelectedDate != null) {
          _selectedDate = newSelectedDate;
          date
            ..text = DateFormat.yMMMd().format(_selectedDate)
            ..selection = TextSelection.fromPosition(TextPosition(
                offset: date.text.length,
                affinity: TextAffinity.upstream));
        }
      }
    }
    class AlwaysDisabledFocusNode extends FocusNode {
      @override
      bool get hasFocus => false;
    }
 

Ответ №1:

 DatabaseReference userId = _ref.push();
  print('Pushed Key'   userId.key);
  id = userId.key;
  userId.set(data);
 

Добавьте это в свою функцию void saveRecord ().

Здесь вы также получите данные о нажатых клавишах на консоли.

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

1. привет, спасибо за ответ. но у меня все еще есть ошибка в «идентификаторе» и «данных», там написано неопределенное имя «идентификатор» и неопределенное имя «данные». что мне делать?

2. объявите его как идентификатор строки; в вашем классе с сохранением состояния и в разделе «данные» указано имя корневого узла базы данных firebase в режиме реального времени. Внесите изменения в соответствии с именем узла базы данных firebase в реальном времени.

3. @Newuser вам удалось исправить ошибку, используя решение, предложенное Яшем Дханде?

4. привет, нет. Я меняю базу данных в реальном времени на Firestore @Farid Shumbar