快速提问。每当我使用电子邮件和密码创建 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();
}
}