【问题标题】:Flutter Redux Persistent doesn't store Map<String, dynamic>Flutter Redux Persistent 不存储 Map<String, dynamic>
【发布时间】: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);
}

感谢您的帮助!

【问题讨论】:

    标签: flutter dart redux


    【解决方案1】:

    我刚刚发现了错误: 在构造函数中,我错过了 authUser 前面的 this 关键字。

    【讨论】:

      猜你喜欢
      • 2021-02-11
      • 2021-06-09
      • 2022-11-01
      • 2018-10-14
      • 1970-01-01
      • 2023-03-27
      • 2021-09-01
      • 2021-08-18
      • 2021-03-23
      相关资源
      最近更新 更多