Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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
Flutter 颤振与振动;Firebase:如何验证isNewUser Firebase和show Welcome屏幕是否抖动?_Flutter_Firebase Authentication - Fatal编程技术网

Flutter 颤振与振动;Firebase:如何验证isNewUser Firebase和show Welcome屏幕是否抖动?

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

我正在开发一个通过Firebase进行登录、注册和自制认证的应用程序。每当用户创建注册时,他都会进入主屏幕。我想检查用户是否是新用户,以便在注册后打开欢迎屏幕。我怎么能这么做?请在代码中指定如何执行此操作。下面是auth.dart类,其中使用Firebase和landing_screen.dart进行身份验证,其中调用了HomeScreen()。如果用户不熟悉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();
  }
}
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();
        }
      },
    );
  }
}