![](/img/trans.png)
[英]flutter + firebase passwordless email login - dynamic link data returns null
[英]Flutter Google Sign In - Email data returns null
Flutter Google Sign In - Email数据返回null。日志如下。 非常感谢你提前。
我使用 Firebase。
我想用谷歌登录,但是AuthResult.user.email == null
----------------------日志错误------------------------ ----
D/FirebaseAuth( 5302): Notifying id token listeners about user ( 9uKLCYS4VwUbuu77KS27bWjKrlI2 ).
I/flutter ( 5302): Result : Poyraz Çakmak https://lh3.googleusercontent.com/a-/AAuE7mABS7DqwgoIHuFfIwNw_574FRdvxKuvVyNarFo0_w=s96-c null
I/flutter ( 5302): NoSuchMethodError: The method 'indexOf' was called on null.
I/flutter ( 5302): Receiver: null
I/flutter ( 5302): Tried calling: indexOf("@")
因为用户 model 来自 userName 格式。 => 尝试调用:indexOf("@")
谷歌登录方法:
@override
Future<User> login() async {
final GoogleSignInAccount googleSignInAccount =
await MyToolsFirebase.googleSignIn.signIn();
if (googleSignInAccount != null) {
GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
final String idToken = googleSignInAuthentication.idToken;
final String accessToken = googleSignInAuthentication.accessToken;
if (idToken != null && accessToken != null) {
AuthResult authResult = await MyToolsFirebase.firebaseAuth
.signInWithCredential(GoogleAuthProvider.getCredential(
idToken: idToken, accessToken: accessToken));
return await MyToolsFirebase.saveDbUser(firebaseUser: authResult.user);
}
}
return null;
}
我的工具Firebase class:
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:live_chat/Models/User.dart';
class MyToolsFirebase {
static final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
static final GoogleSignIn googleSignIn = GoogleSignIn(
scopes: <String>[
'https://www.googleapis.com/auth/contacts.readonly',
'https://www.googleapis.com/auth/plus.login',
'https://www.googleapis.com/auth/userinfo.email'
],
);
static final Firestore firestore = Firestore.instance;
static User userFromFirebaseUser({@required FirebaseUser firebaseUser}) {
if (firebaseUser == null) return null;
print("Result : ${firebaseUser.displayName} ${firebaseUser.photoUrl} ${firebaseUser.email}");
return User(
uid: firebaseUser.uid,
email: firebaseUser.email,
name: firebaseUser.displayName,
imageURL: firebaseUser.photoUrl,
);
}
static Future<User> saveDbUser({@required FirebaseUser firebaseUser}) async {
User user = userFromFirebaseUser(firebaseUser: firebaseUser);
Map userMap = user.toMap();
await firestore.collection("users").document(user.uid).setData(userMap);
return await getDbUser(user.uid);
}
static Future<User> getDbUser(String uid) async {
DocumentSnapshot documentSnapshot = await Firestore.instance.collection("users").document(uid).get();
print(User.fromMap(documentSnapshot.data).toString());
return User.fromMap(documentSnapshot.data);
}
}
用户model:
class User {
final String uid;
String email;
String userName;
String name;
String imageURL;
int level;
DateTime createdAt;
DateTime updatedAt;
User({
@required this.uid,
@required this.email,
this.userName,
this.name,
this.imageURL,
this.level,
this.createdAt,
this.updatedAt,
});
User.fromMap(Map<String, dynamic> map)
: this.uid = map["uid"],
this.email = map["email"],
this.userName = map["userName"],
this.name = map["name"],
this.imageURL = map["imageURL"],
this.level = int.parse(map["level"]),
this.createdAt = (map["createdAt"] as Timestamp).toDate(),
this.updatedAt = (map["updatedAt"] as Timestamp).toDate();
Map<String, dynamic> toMap() {
DateTime now = DateTime.now().toLocal().toUtc();
return {
'uid': this.uid,
'email': this.email,
'userName': this.userName ?? this.email.substring(0, this.email.indexOf("@")) + Random().nextInt(1000).toString(),
'name': this.name,
'imageURL': this.imageURL ?? "https://www.logolynx.com/images/logolynx/61/61ba01858af7f2ea1184238e9f2771f2.png",
'level': this.level ?? 1,
'createdAt': this.createdAt ?? now,
'updatedAt': this.updatedAt ?? now,
};
}
}
@override
Future<User> signInWithGoogle() async {
GoogleSignIn _googleSignIn = GoogleSignIn();
GoogleSignInAccount _googleUser = await _googleSignIn.signIn();
String _googleUserEmail = _googleUser.email; //BURADA GMAİL OTURUMUNDAN
// DİREKT OLARAK MAİL ADRESİNİ ALMAYA ÇALIŞIYORUM.
if (_googleUser != null) {
GoogleSignInAuthentication _googleAuth = await _googleUser.authentication;
if (_googleAuth.idToken != null && _googleAuth.accessToken != null) {
AuthResult sonuc = await _firebaseAuth.signInWithCredential(
GoogleAuthProvider.getCredential(
idToken: _googleAuth.idToken,
accessToken: _googleAuth.accessToken));
FirebaseUser _user = sonuc.user;
sonuc.user.updateEmail(_googleUserEmail);
//Burada Email Adresini Güncelliyoruz.
//Böylece null olan değer doluyor.
return _userFromFirebase(_user);
} else {
return null;
}
} else {
return null;
}
}
我找到了解决方案。 只需在您引用用户 email 的任何地方使用user.providerData[0].email
.email。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.