Как мне вызвать запрос на получение сразу после входа в систему во флаттере? - PullRequest
0 голосов
/ 25 мая 2020

Я застрял и не мог подумать о решении и логи c. У меня есть этот сценарий, когда пользователь вошел в систему. Мне нужно получить данные профиля в соответствии с идентификатором пользователя, вошедшего в систему. Так что я могу получить данные пользователя и показать их в приложении.

Я использую flutter blo c. Где и когда мне вызывать API? Я попробовал это сразу после события входа в систему, а также попытался вызвать его в init (), но не смог определить фактический лог c этого.

Я очень запутался. Пожалуйста, помогите мне объяснить logi c этому потоку.

1 Ответ

0 голосов
/ 25 мая 2020

Привет, когда пользователь вошел в систему, сохраните его идентификатор профиля в безопасном хранилище, после этого pu sh новый экран (например, главный экран и в состоянии инициализации загрузите ваш профиль)

Login blo c:

class LoginBloc extends Bloc<LoginEvent, LoginState> {
  Api _repository;
  TokenManager _tokenManager;

  LoginBloc({
    @required Api repository,
    @required TokenManager tokenManager
  })  : assert(repository != null),
        assert(tokenManager != null),
        _repository = repository,
        _tokenManager = tokenManager;

  @override
  LoginState get initialState => LoginState.empty();

   @override
   Stream<LoginState> mapEventToState(LoginEvent event) async* {
     if (event is LoginWithCredentialsPressed) {
        yield* _mapLoginWithCredentialsPressedToState(
         login: event.login,
          password: event.password,
        );
     }
   }
   Stream<LoginState> _mapLoginWithCredentialsPressedToState({
     String login,
     String password,
   }) async* {
     yield LoginState.loading();
    try {
      LoginResponse loginResponse = await _repository.login(login, password, password);
      await _tokenManager.setToken(loginResponse.token);
      await _tokenManager.setRefreshToken(loginResponse.refresh_token);
      yield LoginState.success();
    } catch (_) {
      yield LoginState.failure();
    }
  }
}

затем добавьте код, например, обратите внимание, это не полный код, я удалил некоторые части

 @override
 Widget build(BuildContext context) {
   return BlocListener<LoginBloc, LoginState>(listener: (context, state) {
     if (state.isSuccess) {
       Navigator.pushReplacementNamed(context, '/main'); 
     }
   }, child: BlocBuilder<LoginBloc, LoginState>(builder: (context, state) {
  return Padding(
    padding: EdgeInsets.all(20),
    child: Form(
      child: ListView(
        children: <Widget>[
          Padding(
            padding: EdgeInsets.symmetric(vertical: 20),
            child: SvgPicture.asset(
              'assets/logo.svg',
              width: MediaQuery
                  .of(context)
                  .size
                  .width,
              height: 150,
            ),
          ),
        ],
      ),
    ),
  );
}));

Итак, pu sh ваш основной blo c и переопределите его initState () вроде (это ваш виджет)

  @override
  void initState() {
    super.initState();
    _menuBloc = BlocProvider.of<MenuBloc>(context);
    _menuBloc.add(ModuleInitialized());
  }

И в свой файл blo c добавьте код для загрузки ваших данных. Если есть вопросы, не стесняйтесь их задавать)

...