0

快速提问。每当我使用电子邮件和密码创建 firebase 用户时,路由不会将用户带到他的正确页面。

User user = context.watch<User>();
if (user == null) return LoginScreen();
///
    rest of the code here where the user type stored in Firestore decides which page to navigate to
///

createUserWithEmailAndPassword文档没有说它更新了 authStateChanges 方法。另一方面,signInWithEmailAndPassword文档FirebaseAuth.instance.signOut()明确指出它更新了 authStateChanges 方法。当我登录时,用户确实被带到了正确的页面。我认为那createUserWithEmailAndPassword会做同样的事情。

那么我应该手动将用户导航到正确的页面(同时弹出所有以前的路线)吗?

先感谢您。


路由代码:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // final _themeProvider = Provider.of<ThemeProvider>(context);
    return MultiProvider(
      providers: [
        ChangeNotifierProvider<ThemeProvider>(create: (context) => ThemeProvider()),
        Provider<CurrentUser>(create: (context) => CurrentUser()),
        StreamProvider(create: (context) => context.read<CurrentUser>().authStateChanges),
      ],
      child: MaterialApp(
        home: LandingRouting(),
      ),
    );
  }
}


class LandingRouting extends StatelessWidget {
  const LandingRouting({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    logger.w('Landing Routing ...');
    User user = context.watch<User>();

    if (user == null) return LoginScreen();

    return FutureBuilder(
      future: FirebaseFirestore.instance.collection('users').doc(user.uid).get(),
      builder: (context, AsyncSnapshot<DocumentSnapshot> snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) return Loading();

        if (snapshot.hasError)
          return AlertDialog(
            title: Text('Error loading user'),
            content: Text('${snapshot.error.toString}'),
          );
        else {
          Map<String, dynamic> userData = snapshot.data.data();
          assert(userData['userType'] != null, 'User Type cannot be null');

          if (userData['userType'] == 'baqala') {
            return BaqalaUserScreen();
          } else {
            return UserHomeScreen();
          }
        }
      },
    );
  }
}

注册码:

class BaqalaAuth {
  static void registerBaqala({
    @required BuildContext context,
    @required String baqalaName,
    @required String license,
    @required String landlineNumber,
    @required String mobileNumber,
    @required String email,
    @required String password,
    @required double lat,
    @required double long,
  }) async {
    try {
      FirebaseAuth.instance.createUserWithEmailAndPassword(email: email, password: password).then(
        (userCred) async {
          BaqalaInit.initBaqala(
            context: context,
            user: userCred.user,
            landlineNumber: landlineNumber,
            mobileNumber: mobileNumber,
            licenseNumber: license,
            baqalaName: baqalaName,
            lat: lat,
            long: long,
          );
          await userCred.user.updateProfile(displayName: baqalaName);
        },
      );
.
.
.

登录代码

class Auth {
  static void login({
    @required BuildContext context,
    @required String email,
    @required String password,
  }) async {
    try {
      FocusScope.of(context).unfocus();
      await FirebaseAuth.instance.signInWithEmailAndPassword(email: email, password: password);
    } on PlatformException catch (e) {
      logger.i('Login: Firebase Auth Exception');
      _loginException(context, 'Error: ${e.code}\n\n${e.message}');
    } on FirebaseAuthException catch (e) {
      logger.i('Login: Firebase Auth Exception');
      _loginException(context, 'Error: ${e.code}\n\n${e.message}');
    } catch (e) {
      _loginException(context, 'Login: Error: ${e.toString}');
    }
  }

  static Future<void> logout() async {
    await FirebaseAuth.instance.signOut();
  }
}
4

0 回答 0