上下文:我正在尝试使用 firebase_auth 为我的应用创建身份验证流程,用户可以通过个人资料页面上的按钮注销。
最初,注销按钮位于登录后立即出现的主页(名为 Maps)上。这是由在成功登录时打开 Maps 的包装类调用的。
但是,当用户单击“个人资料”页面中的退出按钮时,他们不会回到登录屏幕,直到他们返回“ map ”页面。
预期结果:
实际:
代码(分步):
// auth change user stream
// set up a stream so that everytime someone signs in/out, we get a response
// down the stream
Stream<User> get user {
return _auth.onAuthStateChanged
.map(_userFromFirebaseUser); // same as line above
}
// sign out
Future signOut() async {
try {
return await _auth.signOut();
} catch (e) {
print(e.toString());
return null;
}
}
class Wrapper extends StatelessWidget {
@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
// return either Maps or Login widget
if (user == null) {
return Authenticate();
} else {
return MapsPage();
}
}
}
// Function is for when a navigation icon is tapped
void onTabTapped(int index) {
setState(() {
_selectedIndex = index;
});
if (index == 1) {
startCamera();
} else if (index == 2) {
Navigator.of(context).push(MaterialPageRoute(
builder: (BuildContext context) => new UserProfile()));
}
}
@override
Widget build(BuildContext context) {
return StreamProvider<QuerySnapshot>.value(
value: DatabaseService().users,
child: Scaffold(
body: // some code here,
bottomNavigationBar: BottomNavigationBar(
items: const <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(Icons.map),
title: Text('Map'),
),
BottomNavigationBarItem(
icon: Icon(Icons.camera),
title: Text("Camera"),
),
BottomNavigationBarItem(
icon: Icon(Icons.account_circle),
title: Text('Profile'),
),
],
currentIndex: _selectedIndex,
selectedItemColor: Colors.white,
backgroundColor: Color(0xFFFFA600),
onTap: onTabTapped,
)));
}
final AuthService _auth = AuthService();
@override
Widget build(BuildContext context) {
return StreamProvider<User>.value(
value: AuthService().user,
child: Scaffold(
body: Column(
children: <Widget>[
ButtonTheme(
child: FlatButton(
child: const Text('Log Out'),
onPressed: () async {
await _auth.signOut();
},
),
)
],
),
),
);
}
如果需要更多信息,请告诉我,并提前致谢。
最佳答案
当我退出我的应用程序时,我通常会执行以下操作:
onTap: () {
Navigator.popUntil(context, ModalRoute.withName("/"));
_auth.signOut();
},
试试这个,它可能会起作用。
关于Flutter 提供程序不更新变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61685391/