【发布时间】:2020-10-26 14:01:30
【问题描述】:
我有一个实现 firebase 身份验证的颤振应用。遵循this 教程后,我的 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(),
),
);
}
}
值: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() 屏幕注销。
但是,Home() 屏幕导航的布局如下:
- 首页()
- 第二页()
- 第三页()
- 第二页()
我在前进时使用 Navigator.push()(即从“SecondPage()”到“ThirdPage()”)。然后,我将第二页和第三页脚手架包裹在 WillPopScope 中,onWillPop 调用 Navigator.pushReplacement() 来向后导航。
(注意:我这样做是因为这些页面从 firebase firestore 读取和写入数据,并且 Navigator.pop() 不会导致重新渲染。这意味着用户可能会在ThirdPage() 会更改 firestore 中的值,但是当我随后调用 Navigator.pop() 时,它不会使用新数据更新 SecondPage()。)
我的问题是,从 SecondPage() 导航到 Home() 页面时有关 Navigator.pushReplacement() 的某些问题会导致问题,因此当用户注销时,屏幕不会显示 Authenticate()页面。
我在 Wrapper() 中调用了print("user is null, should show Authenticate()"),以验证用户单击注销按钮时if (user == null) 是否为true。它会打印,但仍然不显示 Authenticate() 屏幕。
我知道它与 pushReplacement() 有关,因为直接从 Home() 注销而没有正确导航任何功能(即显示 Authenticate() 页面)。任何帮助表示赞赏。
【问题讨论】:
标签: flutter firebase-authentication flutter-provider