Android 如何在Flatter中使用firestore中的uid更新用户数据
我正在从事一个项目,在该项目中,我在Fire store中存储了用户数据,包括姓名、电子邮件和用户角色,下面是该项目的屏幕截图,用户角色定义为basic 现在这里是我的身份验证服务代码Android 如何在Flatter中使用firestore中的uid更新用户数据,android,firebase,flutter,google-cloud-firestore,firebase-authentication,Android,Firebase,Flutter,Google Cloud Firestore,Firebase Authentication,我正在从事一个项目,在该项目中,我在Fire store中存储了用户数据,包括姓名、电子邮件和用户角色,下面是该项目的屏幕截图,用户角色定义为basic 现在这里是我的身份验证服务代码 import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:google_sign_in/google_sign_in.dart'
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:http/http.dart';
class GSignInhelp {
static FirebaseAuth _auth = FirebaseAuth.instance;
static signInWithGoogle() async {
GoogleSignIn googleSignIn = GoogleSignIn();
final account = await googleSignIn.signIn();
final auth = await account.authentication;
final credential = GoogleAuthProvider.credential(
accessToken: auth.accessToken,
idToken: auth.idToken,
);
final res = await _auth.signInWithCredential(credential);
return res.user;
}
static logOut(){
GoogleSignIn().signOut();
return _auth.signOut();
}
}
String role = 'basic';
class Usertype {
static FirebaseFirestore _db = FirebaseFirestore.instance;
static saveUser(User user) async {
Map<String,dynamic> userData = {
'name': user.displayName,
'email': user.email,
'role' : role,
};
final userRef = _db.collection('users').doc(user.uid);
if((await userRef.get()).exists){
get('role');
userData.update('role', (value) => role);
}else{
await userRef.set(userData);
}
}
}
这是主要的活动代码
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gfd_official/Login_data/Login.dart';
import 'package:gfd_official/Login_data/gSignin_data.dart';
import 'package:gfd_official/Mainhome.dart';
import 'package:gfd_official/paid_screens/Expert1year.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ghori fashion designer',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MySplashScreen(),
);
}
}
class MySplashScreen extends StatefulWidget {
@override
_MySplashScreenState createState() => _MySplashScreenState();
}
// ignore: camel_case_types
class _MySplashScreenState extends State<MySplashScreen> {
@override
void initState() {
// TODO: implement initState
super.initState();
Future.delayed(
Duration(
seconds: 3,
),
() {});
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.hasData && snapshot.data != null) {
Usertype.saveUser(snapshot.data);
return StreamBuilder(
stream: FirebaseFirestore.instance.collection('users').doc(
snapshot.data.uid).snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData && snapshot.data != null) {
final user = snapshot.data.data();
if(user['role'] == 'fullexpert'){
return Expert1year();
}else{
return Mainhome();
}
}
return Material(
child: Center(child: CircularProgressIndicator(),),);
});
}
return Loginpage();
},
);
}
}
import'包:cloud_firestore/cloud_firestore.dart';
导入“包:firebase_auth/firebase_auth.dart”;
导入“包:firebase_core/firebase_core.dart”;
进口“包装:颤振/cupertino.dart”;
进口“包装:颤振/材料.省道”;
导入“包:gfd_官方/Login_数据/Login.dart”;
导入“package:gfd_official/Login_data/gSignin_data.dart”;
进口“包装:gfd_官方/Mainhome.dart”;
进口“包装:gfd_官方/付费屏幕/专家1年.dart”;
void main()异步{
WidgetsFlutterBinding.ensureInitialized();
等待Firebase.initializeApp();
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“ghori时装设计师”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MySplashScreen(),
);
}
}
类mysplashsscreen扩展StatefulWidget{
@凌驾
_MySplashScreenState createState()=>\u MySplashScreenState();
}
//忽略:驼峰\u案例\u类型
类_mysplashscrenstate扩展状态{
@凌驾
void initState(){
//TODO:实现initState
super.initState();
推迟(
持续时间(
秒:3,
),
() {});
}
@凌驾
小部件构建(构建上下文){
返回流生成器(
流:FirebaseAuth.instance.authStateChanges(),
生成器:(上下文,快照){
if(snapshot.hasData&&snapshot.data!=null){
Usertype.saveUser(snapshot.data);
返回流生成器(
流:FirebaseFirestore.instance.collection('users').doc(
snapshot.data.uid).snapshots(),
生成器:(BuildContext上下文,异步快照){
if(snapshot.hasData&&snapshot.data!=null){
最终用户=snapshot.data.data();
如果(用户['role']='fullexpert'){
返回专家1年();
}否则{
返回main home();
}
}
退货(
child:Center(child:CircularProgressIndicator(),),);
});
}
返回登录页面();
},
);
}
}
当我运行应用程序并在成功后付款时,付款没有发生任何事情,当我注销并再次登录Firestore时,角色会发生变化,但我注意到一些奇怪的情况,当我使用帐户付款并注销时,我只是使用不同的帐户角色登录,用于刚刚登录的用户,但不用于已更改的用户已付款。
还有一个问题是,下一次用户登录角色时,角色仅会更改一次,而不再是fullexpert
我在谷歌上搜索过,但由于2020年firebase和Flitter发生了重大变化,所有方法都不适用
如果有人可以帮助我,我如何使用用户唯一id或UID更改用户角色,此更改将一直保留,直到用户升级角色或降级角色,并且应针对特定用户,,当调用_handlePaymentSuccess时,它将更新状态值
角色
,但是用户文档streambuilder中未引用角色
,请尝试以下操作:
未经测试
SuccessHandler(已更新):
void\u handlePaymentSuccess(PaymentSuccessResponse){
flattertoast.showtoos(消息:“SUCCESS:+response.paymentId);
//直接从此处更新用户角色。调用此角色时,streambuilder将
//雷菲什。
update({'role':'fullexpert'})。然后((value)=>print('Done!');
//设置状态(){
//角色='fullexpert';
//});
}
//字符串角色='basic';
文档引用userRef;
类用户类型{
静态FirebaseFirestore _db=FirebaseFirestore.instance;
静态存储用户(用户用户)异步{
映射用户数据={
“名称”:user.displayName,
“电子邮件”:user.email,
“角色”:角色,
};
userRef=_db.collection('users').doc(user.uid);
如果((wait userRef.get())存在){
//尝试删除此项,因为它是多余的:
//获取('role');/???
//update('role',(value)=>role);
}否则{
等待userRef.set(userData);
}
}
}
调用_handlePaymentSuccess时,它会更新状态值角色
,但在用户文档streambuilder中未引用角色
,请尝试以下操作:
未经测试
SuccessHandler(已更新):
void\u handlePaymentSuccess(PaymentSuccessResponse){
flattertoast.showtoos(消息:“SUCCESS:+response.paymentId);
//直接从此处更新用户角色。调用此角色时,streambuilder将
//雷菲什。
update({'role':'fullexpert'})。然后((value)=>print('Done!');
//设置状态(){
//角色='fullexpert';
//});
}
//字符串角色='basic';
文档引用userRef;
类用户类型{
静态FirebaseFirestore _db=FirebaseFirestore.instance;
静态存储用户(用户用户)异步{
映射用户数据={
“名称”:user.displayName,
“电子邮件”:user.email,
“角色”:角色,
};
userRef=_db.collection('users').doc(user.uid);
如果((wait userRef.get())存在){
//尝试删除此项,因为它是多余的:
//获取('role');/???
//update('role',(value)=>role);
}否则{
等待userRef.set(userData);
}
}
}
尝试使用提供程序包。在提供程序中设置您的侦听器,并在将新值保存到公共变量后通知更改。@BrandonPillay您能解释一下吗?\u handlePaymentSuccess从何处调用?@BrandonPillay我正在使用Razorpay payment Gatewaway它为我们提供了成功的函数,失败和外部钱包。@BrandonPillay未工作付款后未发生任何情况,即使未打印
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gfd_official/Login_data/Login.dart';
import 'package:gfd_official/Login_data/gSignin_data.dart';
import 'package:gfd_official/Mainhome.dart';
import 'package:gfd_official/paid_screens/Expert1year.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ghori fashion designer',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MySplashScreen(),
);
}
}
class MySplashScreen extends StatefulWidget {
@override
_MySplashScreenState createState() => _MySplashScreenState();
}
// ignore: camel_case_types
class _MySplashScreenState extends State<MySplashScreen> {
@override
void initState() {
// TODO: implement initState
super.initState();
Future.delayed(
Duration(
seconds: 3,
),
() {});
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.hasData && snapshot.data != null) {
Usertype.saveUser(snapshot.data);
return StreamBuilder(
stream: FirebaseFirestore.instance.collection('users').doc(
snapshot.data.uid).snapshots(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData && snapshot.data != null) {
final user = snapshot.data.data();
if(user['role'] == 'fullexpert'){
return Expert1year();
}else{
return Mainhome();
}
}
return Material(
child: Center(child: CircularProgressIndicator(),),);
});
}
return Loginpage();
},
);
}
}
void _handlePaymentSuccess(PaymentSuccessResponse response){
Fluttertoast.showToast(msg: "SUCCESS: "+ response.paymentId);
//Update the User role directly from here. When this is called the streambuilder will
//refesh.
userRef.update({'role': 'fullexpert'}).then((value) => print('Done!'));
//setState(() {
//role = 'fullexpert';
//});
}
//String role = 'basic';
DocumentReference userRef;
class Usertype {
static FirebaseFirestore _db = FirebaseFirestore.instance;
static saveUser(User user) async {
Map<String,dynamic> userData = {
'name': user.displayName,
'email': user.email,
'role' : role,
};
userRef = _db.collection('users').doc(user.uid);
if((await userRef.get()).exists){
//Try removing this as it redundant:
//get('role');//???
//userData.update('role', (value) => role);
}else{
await userRef.set(userData);
}
}
}