【发布时间】:2020-08-10 10:19:37
【问题描述】:
我正在使用流生成器来检测用户是否登录。
return StreamBuilder<User>(
stream: AuthService().user,
builder: (context, snapshot) {
if (snapshot.hasData)
return SectionWrapper();
else
return Authentication();
});
这是我正在使用的流
Stream<User> get user {
return _auth.onAuthStateChanged.map(_userFromFirebaseUser);
}
//create user object based on firebase user
User _userFromFirebaseUser(FirebaseUser user) {
return user != null ? User(uid: user.uid, email: user.email) : null;
}
在部分包装器中,有 2 个按钮导航到应用程序的两个不同部分,当我在其中一个部分中使用注销方法时,流构建器不会更新,它需要刷新才能更新状态。
我还尝试在部分包装器中放置一个按钮以退出,它可以在我导航到其中一个部分之前工作并更新 UI。
这是 sectionWrapper() 小部件树。
Column(
children: <Widget>[
CupertinoButton(
child: Text('Donation & Selling Section'),
onPressed: () {
Navigator.pushReplacementNamed(
context, Section1.routeName,
arguments: user);
}),
CupertinoButton(
child: Text('Bookstores Section'),
onPressed: () {
Navigator.pushReplacementNamed(
context, Section2.routeName);
}),
//works before navigation, does not work after navigation back here
CupertinoButton(
child: Text('Sign out'),
onPressed: () async {
await AuthService().signOut();
}),
],
),
我也尝试将流提供程序与消费者一起使用,但我遇到了同样的问题。
class Wrapper extends StatelessWidget {
static const String routeName = '/';
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
return user == null ? Authentication() : SectionWrapper();
}
}
我使用流提供程序包装了材质应用程序。
MultiProvider(
providers: [
StreamProvider<User>.value(value: AuthService().user),
//other providers
],
child: MaterialApp(
【问题讨论】:
-
您应该为此使用流提供程序。
-
我试过了,结果还是一样
-
Streambuilder 有更多样板。您可能需要检查错误和连接状态,例如this example from the docs。我并不惊讶这不起作用。
-
StreamProvider 将 100% 工作。我也在做同样的事情。您是否将提供程序放在小部件树中足够高的位置?您可以与 streamProvider 分享您的代码吗?并指出你把提供者放在哪里?
-
我编辑了问题并分享了代码,我认为它已经足够高了,除非我应该在导航时传递一些数据。请看一下
标签: flutter authentication dart flutter-navigation