# #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