我正在用多个提供程序包装我的物料应用程序,其中之一是正在监听此getter的流提供程序。
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;
}
在这里,我基本上是基于Firebase用户创建自己的用户
class User with ChangeNotifier {
final String uid;
final String email;
User({this.uid, this.email});
}
我有一个返回Authentication()或SectionWrapper()的包装器
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
return user == null ? Authentication() : SectionWrapper();
}
}
在部分包装中,我有2个按钮可导航到应用程序的2个不同部分。
class SectionWrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).primaryColor,
body: SizedBox.expand(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
CupertinoButton(
color: Theme.of(context).accentColor,
child: Text('Go to individual sells'),
onPressed: () {
Navigator.pushReplacementNamed(
context, IndividualsTabsScreen.routeName);
}),
SizedBox(height: 10.0),
CupertinoButton(
color: Theme.of(context).accentColor,
child: Text('Go to bookstores'),
onPressed: () {
Navigator.pushReplacementNamed(
context, BookstoresTabsScreen.routeName);
}),
],
),
),
);
}
}
登录功能与流提供程序配合正常。但是在退出时,UI不会更新,因为我将退出方法放在两个部分的抽屉中。我试图将“退出”按钮放在SectionWrapper()中,它确实起作用并通过更新UI(返回Authentication())退出,但是当我将其放入应用程序抽屉或其中一个部分的任何屏幕时,它退出,但用户界面不会更新。我还试图用一个消费者包装抽屉,但抽屉也不起作用。
在抽屉中,我尝试使用此
Consumer<User>(
builder: (ctx, user, _) => ListTile(
title: Text('Sign Out'),
leading: Icon(Icons.exit_to_app),
onTap: () async {
print(user.uid.toString()); //prints user id
await _auth.signOut();
print(user.uid.toString()); //also prints user id but i am expecting null value.
},
),
),
当我在刷新应用程序之前使用该应用程序时uid = null,并且在刷新应用程序后,该应用程序显示身份验证屏幕。 您能帮我解决这个问题吗,我已经为这个问题苦苦挣扎了大约2个星期。
编辑:我厌倦了使用流生成器,最后遇到了同样的问题,该问题要求我刷新应用程序以显示身份验证小部件
class Wrapper extends StatelessWidget {
static const String routeName = '/';
@override
Widget build(BuildContext context) {
// final user = Provider.of<User>(context);
// return user == null ? Authentication() : SectionWrapper();
// return Authentication();
return StreamBuilder<User>(
stream: AuthService().user,
builder: (context, snapshot) {
if (snapshot.hasData)
return SectionWrapper();
else
return Authentication();
});
}
}
问题肯定是由于导航器的缘故,因为我试图返回SectionWrapper()并在那里注销,所以发生了相同的问题
答案 0 :(得分:0)
基本上,在注销用户后,您不会通知听众User
的状态已更改。
在此处查看此tutorial。通过notifyListeners()
方法,查看对象如何在对象发生更改时将新状态通知给侦听器。