【发布时间】:2021-09-05 00:29:43
【问题描述】:
我正在尝试制作一个资金管理器应用程序,它有一个用户登录。当用户登录到应用程序时,他们将显示他们自己的交易。但我的问题是当用户登录时,用户可以看到所有数据(不仅是他们的数据),这意味着交易没有添加到唯一 ID,也不会根据登录系统的唯一 ID 显示。任何人都可以帮我解决这个问题吗?我找不到关于这个的任何资源。请帮我。谢谢
记录表
import 'package:dropdownfield/dropdownfield.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:monger_app/page/transaction_daily.dart';
import 'package:monger_app/theme/colors.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart';
import 'package:monger_app/page/record_code.dart';
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 databaseReference = FirebaseFirestore.instance;
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
String _email, _password;
Future<String> getCurrentUID() async {
Future.value(FirebaseAuth.instance.currentUser);
//return uid;
}
@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) {
FirebaseFirestore firestore = FirebaseFirestore.instance;
CollectionReference collect= firestore.collection("TransactionExpense");
final FirebaseAuth _auth = FirebaseAuth.instance;
final User user =_auth.currentUser;
final uid = user.uid;
String dates;
String amounts;
String selectExpenses;
String descriptions;
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: () async {
/*
UserCredential _user =
await FirebaseAuth.instance.signInWithEmailAndPassword(email: _email, password: _password);
String _uid = _user.user.uid;
*/
//await FirebaseFirestore.instance.collection('TransactionExpense').doc(_uid).set({
/*
collect.add({
'date': date.text,
'amount': 'RM' + amount.text,
'category': selectExpense,
'description': description.text,
});
date.text = "";
amount.text = "";
description.text = "";
*/
final FirebaseAuth _auth = FirebaseAuth
.instance;
final User user = _auth.currentUser;
final uid = user.uid;
await DatabaseService().updateData(
uid, date.text, amount.text,
selectExpense, description.text);
},
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 clearButton(){
date.clear();
amount.clear();
category.clear();
description.clear();
}
_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;
}
列表查看代码
Widget build(BuildContext context) {
FirebaseFirestore firestore = FirebaseFirestore.instance;
CollectionReference collect = firestore.collection("TransactionExpense");
final FirebaseAuth _auth = FirebaseAuth.instance;
final User user = _auth.currentUser;
final uid = user.uid;
print('uid: $uid');
String date = '';
String amount = '';
String selectExpense = '';
String description = '';
return FutureBuilder<DocumentSnapshot>(
future: collect.doc(uid).get(),
builder:
(BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
Map<String, dynamic> data = snapshot.data.data();
date = data['date'];
amount = data['amount'];
selectExpense = data['selectExpense'];
description = data['description'];
return ListView(children: [
Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
SizedBox(
width: 10,
),
Text(
selectExpense,
style: TextStyle(
fontSize: 16,
color: primary,
fontWeight: FontWeight.w600),
),
],
),
SizedBox(
height: 10,
),
Row(
children: [
SizedBox(
width: 6,
),
Text(
date,
style: TextStyle(
fontSize: 16,
color: primary,
fontWeight: FontWeight.w600),
),
SizedBox(
width: 200,
),
SizedBox(
width: 10,
),
Text(
amount,
style: TextStyle(
fontSize: 16,
color: primary,
fontWeight: FontWeight.w600),
),
],
),
SizedBox(
height: 8,
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
GestureDetector(
onTap: () {
collect.doc(uid).delete();
//_showDeleteDialog();
//_showDeleteDialog(document: document);
},
child: Row(
children: [
Icon(
Icons.delete_forever_outlined,
color: Colors.red,
),
SizedBox(
width: 6,
),
Text(
'Delete',
style: TextStyle(
fontSize: 16,
color: Colors.red,
fontWeight: FontWeight.w600),
),
],
),
)
],
)
],
),
)
]);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
});
}
【问题讨论】:
标签: flutter google-cloud-firestore firebase-authentication