Flutter Redux Persistent не хранит карту - PullRequest
0 голосов
/ 20 марта 2020

У меня есть следующий 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);
}

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 21 марта 2020

Я только что нашел ошибку: в конструкторе мне не хватало ключевого слова this перед authUser.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...