Я использую следующий простой код для всего процесса входа / регистрации:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<FirebaseUser>.value(
value: _auth.onAuthStateChanged,
child: MaterialApp(
home: Wrapper(),
),
);
}
}
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final firebaseuser = Provider.of<FirebaseUser>(context);
// return either Home or Authenticate widget:
if (firebaseuser == null) {
return WelcomeScreen();
} else {
return StreamProvider<MyUser>.value(
value: FirestoreService(uid: firebaseuser.uid).user,
child: MaterialApp(
home: HomeWrapper(),
),
);
}
}
}
Как видите, я использую второй StreamProvider
для моей модели пользователя (с пользовательскими данными), который заполняется в то же время он создается или входит в систему:
@override
Future<MyUser> signUp(String email, String password, Extrainfo info) async {
try {
AuthResult result = await _auth.createUserWithEmailAndPassword(email: email, password: password);
FirebaseUser firebaseUser = result.user;
// create a new document for the user with the uid
FirestoreService().createUser(firebaseUser.uid,email,extrainfo);
return _userFromFirebaseUser(firebaseUser);
} catch (e) {
//print(e.toString());
//return e.toString();
}
}
Обычно пользователи регистрируются / входят в систему WelcomeScreen()
, а затем второй stream
(MyUser) запускает построение HomeWrapper()
(из где у меня есть все данные пользователя). Пользователи перенаправляются сюда автоматически.
Проблема: : все работает нормально , если я не введу навигацию в WelcomeScreen()
. Мне нужно, чтобы внутри было несколько экранов, но как только я это сделаю, при регистрации экран автоматически не изменится на HomeWrapper()
(хотя значение потока вызывается). Этого не происходит при входе в систему, так как вызывается onAuthStateChanged и повторная сборка запускается выше в дереве виджетов.
Думаю, проблема в том, что второй поставщик находится вне области навигации, но я не знаю как исправить это правильным способом.