У меня есть следующий 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 аутентифицированного пользователя и его данные (идентификатор, имя пользователя, адрес электронной почты).
Эти значения устанавливаются после успешная регистрация:
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),
),
),
),
),
Вкратце, когда я регистрируюсь, токен и auth_user устанавливаются в состояние и могут использоваться на домашнем экране. Однако, если я перезапускаю приложение, оказывается, что только токен является постоянным, а auth_user по умолчанию имеет значение null. Я очень плохо знаком с флаттером и редукцией, поэтому, возможно, я допустил очевидную ошибку.
Редуктор:
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);
}
Спасибо за вашу помощь!