【发布时间】:2020-03-20 10:08:45
【问题描述】:
我有以下 AppState:
class AppState {
String token;
Map<String, dynamic> authUser;
AppState({
this.token = "",
this.authUser,
});
AppState.fromAppState(AppState other) {
token = other.token;
authUser = other.authUser;
}
static AppState fromJson(dynamic json) {
return json != null
? AppState(
token: json["token"],
authUser: json["auth_user"],
)
: AppState();
}
dynamic toJson() => {
"token": token,
"auth_user": authUser,
};
}
如您所见,状态存储了经过身份验证的用户的 JWT 及其数据(id、用户名、电子邮件)。
这些值是在成功注册后设置的:
StoreConnector<AppState, Map<String, Function>>(
converter: (store) => {
"token": (String newToken) =>
store.dispatch(actions.Token(newToken)),
"auth_user": (Map<String, dynamic> authUser) =>
store.dispatch(actions.AuthUser(authUser)),
},
builder: (ctx, setAppState) => FlatButton(
onPressed: () async {
if (username.value.text.isEmpty ||
email.value.text.isEmpty ||
password.value.text.isEmpty ||
!widget.formKey.currentState.validate())
return;
setState(() => loading = true);
try {
final String token = await Api.signup(
username: username.text,
email: email.text,
password: password.text,
);
setAppState["token"](token);
setAppState["auth_user"](
await Api.authUser(token: token));
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => Home(),
),
);
} catch (e) {
showDialog(
context: context,
builder: (context) => AlertDialog(
content: Text(e.toString()),
),
);
} finally {
setState(() => loading = false);
}
},
child: Text(
AppLocalizations.of(context)
.get("signup_label"),
style: TextStyle(
color: Theme.of(context).accentColor,
fontWeight: FontWeight.bold,
fontSize: 21,
),
),
shape: RoundedRectangleBorder(
side: BorderSide(
color: Theme.of(context).accentColor,
width: 3,
),
borderRadius: BorderRadius.all(
Radius.circular(25),
),
),
),
),
简单来说,当我注册时,token和auth_user都设置在状态,可以在主屏幕上使用。 但是,如果我重新启动应用程序,事实证明,只有令牌是持久的,并且 auth_user 默认设置为 null。 我对 Flutter 和 redux 很陌生,所以也许我犯了一个明显的错误。
减速机:
AppState reducer(AppState prevState, dynamic action) {
AppState newState = AppState.fromAppState(prevState);
if (action is Token) {
newState.token = action.token;
}
if (action is AuthUser) {
newState.authUser = action.user;
}
return newState;
}
动作:
class Token {
final String token;
Token(this.token);
}
class AuthUser {
final Map<String, dynamic> user;
AuthUser(this.user);
}
感谢您的帮助!
【问题讨论】: