当我尝试使用与Google登录的用户在Flutter应用中写入Firestore时遇到问题。当用户按下使用Google按钮登录时。它已成功通过Google登录,我可以在Firebase控制台的身份验证页面中看到它。然后,我从Firestore中读取用户是否在Firestore中有其数据,如果用户在Firestore中没有文档,则它返回null并创建它。它在调试模式下可以正常工作,但是当我转到发布模式时,它不起作用。当我将数据设置为Firestore时,不会抛出任何错误,因此就像set函数可以在Firestore中成功编写一样。在发布模式下,如果我使用电子邮件和密码注册用户,它将在firestore中创建用户个人资料,而不会出现问题。我有两个项目,一个用于生产,一个用于开发。带有de debug app的开发项目效果很好。我已经清理了这个项目,跑了个医生,一切似乎都很好。另外,我已经检查了Firestore规则,并且在两个项目中它们都是相同的。
这是在调试中工作的代码
Future<String> signInWithGoogle() async {
final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
final GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
final auth.AuthCredential credential = auth.GoogleAuthProvider.credential(
accessToken: googleSignInAuthentication.accessToken,
idToken: googleSignInAuthentication.idToken,
);
final auth.UserCredential authResult =
await _auth.signInWithCredential(credential);
final auth.User user = authResult.user;
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final auth.User currentUser = await _auth.currentUser;
assert(user.uid == currentUser.uid);
var token = await FCMService().getDeviceToken();
DatabaseService databaseService = DatabaseService(uid: currentUser.uid);
var res = await databaseService.getUserData();
if(res == null) {
print("auth -> getUserDataFromFirestore: El usuario no existe, lo creamos en firestore con estos datos: "
"email: ${newUser.email}, nombre: ${newUser
.nombre}, token: ${newUser.notificationToken}, "
"telefono: ${newUser
.telefono}, tipo: ${newUser.tipo}, uid: ${newUser
.uid}");
User newUser = User(
email: currentUser.email,
nombre: currentUser.displayName,
notificationToken: token,
telefono: currentUser.phoneNumber,
tipo: TIPO_PERSONA_CLIENTE);
assert(await databaseService.setUserData(newUser) ==
"Ok");
}
return '${user.uid}';
}
Future setUserData(User user) async {
return await personasCollection.doc(uid).set({
'direccion': user.direccion,
'dob': user.dob,
'email': user.email,
'nombre': user.nombre,
'idEmpresa': user.idEmpresa,
'identificacion': user.identificacion,
'notificationToken': user.notificationToken,
'rolEmpresa': user.rolEmpresa,
'telefono': user.telefono,
'tipo': user.tipo,
}).then((val) {
return 'Ok';
}).catchError((val) {
return val.toString();
});
}
Future getUserData() async {
return await personasCollection.doc(uid).get()
.then((value){
return value.data();
})
.catchError((e){
throw "$e";
});
}
这是从用户界面获得的尝试
try {
var user = await _auth.signInWithGoogle();
print("sign_in -> usuario se inicio sesión con google, este es su id $user");
} catch (e) {
print("sign_in -> $e");
setState(() {
loading = false;
});
showSingleButtonDialog(
"Error",
"Algo salió mal, por favor inténtalo de nuevo",
"OK",
context);
}
这是调试:
✓构建build / app / outputs / flutter-apk / app-release.apk(8.7MB)。 I / flutter(3955):包装器->内置 E / FlutterFcmService(3955):致命:找不到回调 I / flutter(3955):包装器->内置 I / flutter(3955):包装器-> El Usuario Ha Iniciado Sesion I / flutter(3955):数据库-> getUserData:获取数据使用情况:6W6yF7OrSsaxDaQgHbBFwzbZjN72 I /扑(3955):AUTH - > getUserDataFromFirestore:萨尔瓦多usuario没有existe,罗creamos恩公司的FireStore CON estos DATOS:电子邮件:dropit.informacion@gmail.com,农布雷:Dropit罗llevamos,令牌:cMteTk7lQsa4lkicSzxobj:APA91bHkjrfj6eJBivqCGqcDkih6FHlhPbwb1C_AKrveqHkeunudF6_QQvyR41XH7-z4lLI7sZSOFFwFOW_0QTWR1-zuSluYMO8ffT -ac8aR-4u_s6miU35XLffXIgzMSo3GAPur44Ge,telefono:null,tipo:3,uid:6W6yF7OrSsaxDaQgHbBFwzbZjN72 I / flutter(3955):sign_in->使用惯用的Google搜索工具,并创建ID 6W6yF7OrSsaxDaQgHbBFwzbZjN72
答案 0 :(得分:0)
错误发生在signInWithGoogle()函数中,在发布模式下,flutter禁用了断言。代替断言使用if