Я пробую асинхронное сокращение для Flutter, и мне нравится идея с вложенными состояниями.

У меня такое AppState:

class AppState {
  final LoginState loginState;

  AppState({this.loginState});

  AppState copy({LoginState loginState}) {
    return AppState(
      loginState: loginState ?? this.loginState,
    );
  }

...

И мой LoginState:

class LoginState {
  final bool isLoggedIn;

  LoginState({this.isLoggedIn});

  LoginState copy({bool isLoggedIn}) {
    return LoginState(isLoggedIn: isLoggedIn ?? this.isLoggedIn);
  }

...

Но как мне заставить мой редуктор обновить isLoggedIn в моем LoginState? Я пробовал несколько вещей, но ничего не добился. Это очевидное не работает, это просто отправная точка:

class LoginAction extends ReduxAction {

  final String username;
  final String password;

  LoginAction({this.username, this.password}) : assert(username != null && password != null);

  @override
  AppState reduce() {
    return state.copy(loginState: state.loginState.isLoggedIn = true);
  }
}

Любые идеи?

Спасибо
Серен

1
Neigaard 12 Фев 2021 в 22:13

1 ответ

Лучший ответ

Процесс входа в систему асинхронный, поэтому вам, вероятно, следует использовать Future<AppState> reduce() вместо AppState reduce().

Затем вы должны запустить свой код входа и получить логическое значение, которое указывает, вошел ли пользователь в систему или нет: bool result = await logIn(username, password);

Если это не удалось, выбросить исключение пользователя: if (!done) throw UserException("Please check your username and password.");

На этом этапе воссоздайте состояние с изменением:

class LoginAction extends ReduxAction {

  final String username;
  final String password;

  LoginAction({this.username, this.password}) :
     assert(username != null && password != null);

  @override
  Future<AppState> reduce() {
    if (state.loginState.isLoggedIn) throw UserException("You are already logged in.");

    bool done = await logIn(username, password);

    if (!done) throw UserException("Please check your username and password.");

    return state.copy(
              loginState: state.loginState.copy(isLoggedIn: true),
    );
  }
}
0
MarcG 14 Фев 2021 в 16:58