【问题标题】:Flutter & Firebase: How to validate if isNewUser Firebase and show WelcomeScreen Flutter?Flutter & Firebase:如何验证 isNewUser Firebase 并显示 WelcomeScreen Flutter?
【发布时间】: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


【解决方案1】:

我在自己的项目中使用 shared_preferences 实现了这一点。 我创建了一个小部件,如果这是用户第一次打开应用程序,它会打开一个 InformationScreen(您的欢迎屏幕)和一个 TabScreen(您的 HomeScreen),否则它会直接进入 TabScreen。

这是代码,希望对你有帮助!

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();
        }
      },
    );
  }
}

【讨论】:

    【解决方案2】:

    buildHome() {

    return StreamBuilder(
      stream: FirebaseAuth.instance.onAuthStateChanged,
      builder: (BuildContext context, AsyncSnapshot<FirebaseUser> snapshot) {
        print(snapshot?.data);
        if (snapshot.hasData) {
          return "home screen";
        }
        return "your welcome screen";
      },
    

    【讨论】:

      猜你喜欢
      • 2022-12-28
      • 2021-12-13
      • 2019-01-05
      • 2022-01-11
      • 1970-01-01
      • 2020-07-16
      • 2021-06-10
      • 2020-04-23
      相关资源
      最近更新 更多