【发布时间】:2018-07-06 14:19:57
【问题描述】:
我正在尝试使用this example 在 Flutter 中实现登录/注销。登录工作正常,控制台输出为:
flutter: LOGIN WIDGET BUILD CONTEXT:
flutter: LoginScreen(dirty, state: LoginScreenState#552db)
flutter: _ctx:
flutter: LoginScreen(state: LoginScreenState#552db)
但注销后,我无法重新登录(上下文丢失)。注销并尝试重新登录后,onAuthStateChanged() 中的上下文在注销后丢失:
flutter: LOGIN WIDGET BUILD CONTEXT:
flutter: LoginScreen(dirty, state: LoginScreenState#d112e)
flutter: _ctx
flutter: LoginScreen
login.dart
class LoginScreen extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new LoginScreenState();
}
}
class LoginScreenState extends State<LoginScreen>
BuildContext _ctx;
@override
onAuthStateChanged(AuthState state) {
print("_ctx");
print(_ctx.toString());
if(state == AuthState.LOGGED_IN) {
print("ready to login");
Navigator.of(_ctx).pushReplacementNamed("/home");
}
}
@override
Widget build(BuildContext context) {
_ctx = context;
print("LOGIN WIDGET BUILD CONTEXT:");
print(_ctx.toString());
}
}
home.dart
class Settings extends StatelessWidget {
@override
Widget build(BuildContext context) => new Container(
child: new ListView(
children: <Widget>[
new ListTile(
//leading: Icon(Icons.map),
title: new Text('About')
),
new ListTile(
//leading: Icon(Icons.photo_album),
title: new Text('Logout'),
onTap: () {
Navigator.of(context).pushReplacementNamed("/login");
}
)
],
),
);
路线:
final routes = {
'/login': (BuildContext context) => new LoginScreen(),
'/home': (BuildContext context) => new Tabs(),
'/' : (BuildContext context) => new LoginScreen(),
};
_ctx 没有在onAuthStateChanged() 中更新,有没有更好的方法来处理登录状态?
【问题讨论】:
-
听起来你已经过时了
context -
为什么要将上下文存储在本地字段中?
-
@RémiRousselet 原始示例代码使用了本地字段。
-
State类中已存在本地化字段。无需自己制作 -
您解决了吗?如果有,怎么做?
标签: flutter