Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在Flatter中使用firestore中的uid更新用户数据_Android_Firebase_Flutter_Google Cloud Firestore_Firebase Authentication - Fatal编程技术网

Android 如何在Flatter中使用firestore中的uid更新用户数据

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'

我正在从事一个项目,在该项目中,我在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: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);
  }
 }
}