Flutter 颤振与振动;Firebase:如何验证isNewUser Firebase和show Welcome屏幕是否抖动?
我正在开发一个通过Firebase进行登录、注册和自制认证的应用程序。每当用户创建注册时,他都会进入主屏幕。我想检查用户是否是新用户,以便在注册后打开欢迎屏幕。我怎么能这么做?请在代码中指定如何执行此操作。下面是auth.dart类,其中使用Firebase和landing_screen.dart进行身份验证,其中调用了HomeScreen()。如果用户不熟悉landing_screen.dart,我希望进行验证,以便在注册后打开欢迎屏幕时获得上下文。 谢谢大家的帮助Flutter 颤振与振动;Firebase:如何验证isNewUser Firebase和show Welcome屏幕是否抖动?,flutter,firebase-authentication,Flutter,Firebase Authentication,我正在开发一个通过Firebase进行登录、注册和自制认证的应用程序。每当用户创建注册时,他都会进入主屏幕。我想检查用户是否是新用户,以便在注册后打开欢迎屏幕。我怎么能这么做?请在代码中指定如何执行此操作。下面是auth.dart类,其中使用Firebase和landing_screen.dart进行身份验证,其中调用了HomeScreen()。如果用户不熟悉landing_screen.dart,我希望进行验证,以便在注册后打开欢迎屏幕时获得上下文。 谢谢大家的帮助 class Landing
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();
}
}
class LandingScreen扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
final auth=Provider.of(上下文,listen:false);
返回流生成器(
流:auth.onAuthStateChanged,
生成器:(上下文,快照){
if(snapshot.connectionState==connectionState.active){
User=snapshot.data;
if(user==null){
返回SignenTypeScreen.create(上下文);
}
返回主屏幕();
}否则{
返回脚手架(
正文:中(
孩子:洛蒂(
“assets/circle loading.json”,
高度:100.0,
宽度:100.0,
),
));
}
});
}
}
这里是Auth.dart,在这里可以看到注册用户的Auth
类用户{
用户({@required this.uid});
最后一个字符串uid;
}
抽象类AuthBase{
流得到改变;
Future currentUser();
未来意义重大();
未来使用email和password登录(字符串电子邮件、字符串密码);
未来注册用户(字符串电子邮件、字符串密码);
使用Google()进行未来登录;
未来登录Facebook();
未来签出();
}
类Auth实现AuthBase{
final _firebaseAuth=firebaseAuth.instance;
用户\u userFromFirebase(FirebaseUser用户){
if(user==null){
返回null;
}
返回用户(uid:User.uid);
}
//每次用户登录或注销时接收firebase用户时,请执行某些操作
@凌驾
流得到更改{
返回_firebaseAuth.onAuthStateChanged.map(_userFromFirebase);
}
@凌驾
Future currentUser()异步{
最终用户=等待_firebaseAuth.currentUser();
返回\u userFromFirebase(用户);
}
@凌驾
Future name()异步{
final authResult=等待_firebaseAuth.signinanoymously();
返回\u userFromFirebase(authResult.user);
}
@凌驾
带email和密码(字符串电子邮件、字符串密码)的未来登录异步{
final authResult=wait_firebaseAuth.sign with Email and Password(
电子邮件:电子邮件,密码:密码);
返回\u userFromFirebase(authResult.user);
}
@凌驾
未来注册用户(字符串电子邮件、字符串密码)异步{
final authResult=Wait_firebaseAuth.createUserWithEmailAndPassword(
电子邮件:电子邮件,密码:密码);
if(authResult.additionalUserInfo.isNewUser){
打印(“功能”);
}
返回\u userFromFirebase(authResult.user);
}
@凌驾
未来登录使用Google()异步{
最终谷歌签名谷歌签名=谷歌签名();
最终googleAccount=等待googleSignIn.signIn();
如果(googleAccount!=null){
final googleAuth=等待googleAccount.authentication;
if(googleAuth.accessToken!=null&&googleAuth.idToken!=null){
final authResult=等待_firebaseAuth.signInWithCredential(
GoogleAuthProvider.getCredential(
idToken:googleAuth.idToken,
accessToken:googleAuth.accessToken,
),
);
返回\u userFromFirebase(authResult.user);
}否则{
抛出平台异常(
代码:“错误\缺少\谷歌\身份验证\令牌”,
消息:“缺少Google身份验证令牌”,
);
}
}否则{
抛出平台异常(
代码:'ERROR\u ABORTED\u BY\u USER',
消息:“用户已中止登录”,
);
}
}
@凌驾
未来登录与Facebook()异步{
最终facebookLogin=facebookLogin();
最终结果=等待facebookLogin.logIn(
[“公共档案”],
);
if(result.accessToken!=null){
final authResult=等待_firebaseAuth.signInWithCredential(
FacebookAuthProvider.getCredential(
accessToken:result.accessToken.token,
),
);
返回\u userFromFirebase(authResult.user);
}否则{
抛出平台异常(
代码:'ERROR\u ABORTED\u BY\u USER',
消息:“用户已中止登录”,
);
}
}
@凌驾
Future signOut()异步{
最终谷歌签名=谷歌签名();
等待Google登录。注销();
最终facebookLogin=facebookLogin();
等待facebookLogin.logOut();
等待_firebaseAuth.signOut();
}
}
buildHome(){
返回StreamBuilder(
流:FirebaseAuth.instance.onAuthStateChanged,
生成器:(BuildContext上下文,异步快照){
打印(快照?数据);
if(snapshot.hasData){
返回“主屏幕”;
}
返回“您的欢迎屏幕”;
},
我在自己的项目中使用共享首选项实现了这一点。
我创建了一个小部件,如果用户第一次打开应用程序,它会打开一个信息屏幕(WelcomeScreen for you),然后打开一个选项卡屏幕(HomeScreen for you),否则它会直接进入选项卡屏幕
这是代码,希望对你有所帮助
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../screens/tab_screen.dart';
import '../../screens/information_screen.dart';
import '../../screens/splash_screen.dart';
/// Handles the transition from InformationScreen to TabScreen.
class SignInTransition extends StatefulWidget {
@override
_SignInTransitionState createState() => _SignInTransitionState();
}
class _SignInTransitionState extends State<SignInTransition> {
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
/// Checks if user has seen the information screen before.
Future<bool> _getSeenInfoBefore() async {
final SharedPreferences prefs = await _prefs;
return (prefs.getBool('seenInfoBefore') ?? false);
}
/// Saves that the user has seen the information screen before.
Future<void> _setSeenInfoBefore() async {
final SharedPreferences prefs = await _prefs;
await prefs.setBool('seenInfoBefore', true);
setState(() {}); //* Rebuild the widget to transition to TabScreen.
}
/// Transitions to TabScreen.
void handleTransition() {
_setSeenInfoBefore();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: _getSeenInfoBefore(),
builder: (ctx, snapshot) {
if (snapshot.hasData) {
var seenInfoBefore = snapshot.data;
return seenInfoBefore
? TabScreen()
: InformationScreen(
onClose: handleTransition,
);
} else {
return SplashScreen();
}
},
);
}
}
导入“包装:颤振/材料.省道”;
导入“package:shared_preferences/shared_preferences.dart”;
导入“../screens/tab_screen.dart”;
导入“../screens/information_screen.dart”;
导入“../screens/splash_screen.dart”;
///处理从InformationScreen到
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../screens/tab_screen.dart';
import '../../screens/information_screen.dart';
import '../../screens/splash_screen.dart';
/// Handles the transition from InformationScreen to TabScreen.
class SignInTransition extends StatefulWidget {
@override
_SignInTransitionState createState() => _SignInTransitionState();
}
class _SignInTransitionState extends State<SignInTransition> {
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
/// Checks if user has seen the information screen before.
Future<bool> _getSeenInfoBefore() async {
final SharedPreferences prefs = await _prefs;
return (prefs.getBool('seenInfoBefore') ?? false);
}
/// Saves that the user has seen the information screen before.
Future<void> _setSeenInfoBefore() async {
final SharedPreferences prefs = await _prefs;
await prefs.setBool('seenInfoBefore', true);
setState(() {}); //* Rebuild the widget to transition to TabScreen.
}
/// Transitions to TabScreen.
void handleTransition() {
_setSeenInfoBefore();
}
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: _getSeenInfoBefore(),
builder: (ctx, snapshot) {
if (snapshot.hasData) {
var seenInfoBefore = snapshot.data;
return seenInfoBefore
? TabScreen()
: InformationScreen(
onClose: handleTransition,
);
} else {
return SplashScreen();
}
},
);
}
}