【发布时间】:2021-01-05 13:20:55
【问题描述】:
我正在开发一个通过 Firebase 进行身份验证的应用程序,该应用程序具有登录、注册和自制功能。每当用户创建注册时,他都会进入主屏幕。我想检查用户是否是新用户以在注册后打开欢迎屏幕。我怎么能那样做?请在代码中指定如何完成。下面是使用 Firebase 进行身份验证的 auth.dart 类和调用 HomeScreen () 的landing_screen.dart。如果用户是landing_screen.dart 的新手,我想进行验证,以便在注册后打开欢迎屏幕时可以获得上下文。 谢谢大家的帮助。
class LandingScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final auth = Provider.of<AuthBase>(context, listen: false);
return StreamBuilder<User>(
stream: auth.onAuthStateChanged,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
User user = snapshot.data;
if (user == null) {
return SignInTypeScreen.create(context);
}
return HomeScreen();
} else {
return Scaffold(
body: Center(
child: Lottie.asset(
'assets/circle-loading.json',
height: 100.0,
width: 100.0,
),
));
}
});
}
}
And here Auth.dart where you can see the auth to signUp user
class User {
User({@required this.uid});
final String uid;
}
abstract class AuthBase {
Stream<User> get onAuthStateChanged;
Future<User> currentUser();
Future<User> signInAnonymously();
Future<User> signInWithEmailAndPassword(String email, String password);
Future<User> signUpUser(String email, String password);
Future<User> signInWithGoogle();
Future<User> signInWithFacebook();
Future<void> signOut();
}
class Auth implements AuthBase {
final _firebaseAuth = FirebaseAuth.instance;
User _userFromFirebase(FirebaseUser user) {
if (user == null) {
return null;
}
return User(uid: user.uid);
}
//do something when receive firebase User each time the user SignIn or Signout
@override
Stream<User> get onAuthStateChanged {
return _firebaseAuth.onAuthStateChanged.map(_userFromFirebase);
}
@override
Future<User> currentUser() async {
final user = await _firebaseAuth.currentUser();
return _userFromFirebase(user);
}
@override
Future<User> signInAnonymously() async {
final authResult = await _firebaseAuth.signInAnonymously();
return _userFromFirebase(authResult.user);
}
@override
Future<User> signInWithEmailAndPassword(String email, String password) async {
final authResult = await _firebaseAuth.signInWithEmailAndPassword(
email: email, password: password);
return _userFromFirebase(authResult.user);
}
@override
Future<User> signUpUser(String email, String password) async {
final authResult = await _firebaseAuth.createUserWithEmailAndPassword(
email: email, password: password);
if (authResult.additionalUserInfo.isNewUser) {
print('funciona');
}
return _userFromFirebase(authResult.user);
}
@override
Future<User> signInWithGoogle() async {
final GoogleSignIn googleSignIn = GoogleSignIn();
final googleAccount = await googleSignIn.signIn();
if (googleAccount != null) {
final googleAuth = await googleAccount.authentication;
if (googleAuth.accessToken != null && googleAuth.idToken != null) {
final authResult = await _firebaseAuth.signInWithCredential(
GoogleAuthProvider.getCredential(
idToken: googleAuth.idToken,
accessToken: googleAuth.accessToken,
),
);
return _userFromFirebase(authResult.user);
} else {
throw PlatformException(
code: 'ERROR_MISSING_GOOGLE_AUTH_TOKEN',
message: 'Missing Google Auth Token',
);
}
} else {
throw PlatformException(
code: 'ERROR_ABORTED_BY_USER',
message: 'Sign in aborted by user',
);
}
}
@override
Future<User> signInWithFacebook() async {
final facebookLogin = FacebookLogin();
final result = await facebookLogin.logIn(
['public_profile'],
);
if (result.accessToken != null) {
final authResult = await _firebaseAuth.signInWithCredential(
FacebookAuthProvider.getCredential(
accessToken: result.accessToken.token,
),
);
return _userFromFirebase(authResult.user);
} else {
throw PlatformException(
code: 'ERROR_ABORTED_BY_USER',
message: 'Sign in aborted by user',
);
}
}
@override
Future<void> signOut() async {
final googleSignIn = GoogleSignIn();
await googleSignIn.signOut();
final facebookLogin = FacebookLogin();
await facebookLogin.logOut();
await _firebaseAuth.signOut();
}
}
【问题讨论】:
-
有很多解决方案可以检查用户是否是新用户。使用 FirebaseUser 对象,您可以使用 user.metadata.creationTimestamp 检查用户的创建日期。还有,不过这更多的是检查用户是否刚刚安装了你的应用,你可以在 shared_preferences 中设置一个布尔值,如果它是 false,打开欢迎屏幕,将值设置为 true,然后他就不会再看到它了除非他重新安装应用程序。
标签: flutter firebase-authentication