У меня есть приложение flutter, которое реализует аутентификацию firebase. После выполнения этого руководства мой файл main.dart выглядит так: это:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamProvider<User>.value(
catchError: (_, err) => null,
value: AuthService().user,
child: MaterialApp(
home: Wrapper(),
),
);
}
}
Где value: AuthService (). User возвращается в виде потока следующей функцией get:
// auth change user stream
Stream<User> get user {
return _auth.onAuthStateChanged.map(
(FirebaseUser user) => _userFromFirebaseUser(user),
);
}
User _userFromFirebaseUser(FirebaseUser user) {
return user != null ? User(uid: user.uid) : null;
}
А виджет Wrapper () выглядит так:
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
if (user == null) {
print("user is null, should show Authenticate()");
return Authenticate();
} else {
return Home();
}
}
}
Этот код работает, когда:
- Вход из виджета Authenticate ()
- выход из главного экрана ().
Однако на главном экране () навигация выглядит так:
- Home()
- SecondPage()
- ThirdPage()
- SecondPage()
Я использую Navigator.push () при движении вперед (т.е. от SecondPage () к ThirdPage ()). Затем я обернул скаффолды вторичной и третьей страницы в WillPopScope, где onWillPop вызывает Navigator.pushReplacement () для перехода назад.
(Примечание: я сделал это, потому что эти страницы читают и записывают данные из firebase firestore, а Navigator.pop () не вызывает повторную визуализацию. Это означает, что пользователь может что-то обновить на ThirdPage ( ), который изменяет значение в firestore, но когда я затем вызываю Navigator.pop (), он не обновляет SecondPage () новыми данными.)
Моя проблема в том, что что-то в Navigator.pushReplacement () при переходе со страницы SecondPage () на страницу Home () вызывает проблему, так что, когда пользователь затем выходит из системы, на экране не отображается страница Authenticate ().
Я поместил print("user is null, should show Authenticate()")
вызов в Wrapper (), чтобы убедиться, что if (user == null)
имеет значение true, когда пользователь нажимает кнопку выхода. Он печатает, но по-прежнему не отображает экран Authenticate ().
Я знаю, что это как-то связано с pushReplacement (), так как выход из системы напрямую из Home () без правильной навигации по функциям (т.е. показана страница Authenticate ()). Любая помощь приветствуется.