Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api 我如何在登录到flatter后调用get请求?_Api_Flutter_Dart_Logic - Fatal编程技术网

Api 我如何在登录到flatter后调用get请求?

Api 我如何在登录到flatter后调用get请求?,api,flutter,dart,logic,Api,Flutter,Dart,Logic,我陷入困境,无法思考解决方案和逻辑。 我有一个用户登录的场景,我需要根据登录用户的userID获取配置文件数据。这样我就可以获取用户详细信息并显示在应用程序中 我用的是颤振阵型。我应该在何时何地调用API??我在登录事件之后尝试了它,还尝试了在init()中调用它,但无法理解执行此操作的实际逻辑 我很困惑。请帮助我解释此流程的逻辑。嘿,当用户登录时,将其profileID保存在安全存储中,然后推送新屏幕(例如主屏幕,并在初始状态下下载您的配置文件) 登录区: class LoginBloc ex

我陷入困境,无法思考解决方案和逻辑。 我有一个用户登录的场景,我需要根据登录用户的userID获取配置文件数据。这样我就可以获取用户详细信息并显示在应用程序中

我用的是颤振阵型。我应该在何时何地调用API??我在登录事件之后尝试了它,还尝试了在init()中调用它,但无法理解执行此操作的实际逻辑


我很困惑。请帮助我解释此流程的逻辑。

嘿,当用户登录时,将其profileID保存在安全存储中,然后推送新屏幕(例如主屏幕,并在初始状态下下载您的配置文件)

登录区:

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();
    }
  }
}
classloginbloc扩展了Bloc{
Api_存储库;
TokenManager\u TokenManager;
罗金布洛克({
@所需的Api存储库,
@必需的令牌管理器令牌管理器
}):assert(repository!=null),
断言(令牌管理器!=null),
_存储库=存储库,
_tokenManager=tokenManager;
@凌驾
LoginState get initialState=>LoginState.empty();
@凌驾
流mapEventToState(LoginEvent事件)异步*{
如果(事件登录时按了Credentials){
收益率*\u MAPLOGIN,带凭证加压状态(
登录名:event.login,
密码:event.password,
);
}
}
流_maplogin,带凭证按静态({
字符串登录,
字符串密码,
})异步*{
yield LoginState.load();
试一试{
LoginResponse LoginResponse=await _repository.login(登录、密码、密码);
wait_tokenManager.setToken(loginResponse.token);
wait_tokenManager.setRefreshToken(loginResponse.refresh_token);
yield LoginState.success();
}接住{
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,
            ),
          ),
        ],
      ),
    ),
  );
}));
@覆盖
小部件构建(构建上下文){
返回BlocListener(侦听器:(上下文,状态){
如果(声明isSuccess){
pushReplacementNamed(上下文'/main');
}
},子:BlocBuilder(生成器:(上下文,状态){
返回填充(
填充:边缘设置。全部(20),
孩子:表格(
子:ListView(
儿童:[
填充物(
填充:边缘组。对称(垂直:20),
子项:SvgPicture.asset(
“assets/logo.svg”,
宽度:MediaQuery
.of(上下文)
.尺寸
.宽度,
身高:150,
),
),
],
),
),
);
}));
因此,推送主块并覆盖它的initState()(它是您的小部件)

@覆盖
void initState(){
super.initState();
_menuBloc=BlocProvider.of(上下文);
_menuBloc.add(ModuleInitialized());
}

在您的bloc文件中添加代码以下载您的数据。如果您有一些问题,请随时提问)

谢谢您的回答,但我有一些问题。因此,首先我登录并成功登录后,我将导航到我的主页。然后在主页init()上我将调用profile/userID API以获得正确的用户信息?如果是这种情况,我必须创建一个新的bloc,比如profile bloc,并在那里获得正确的配置文件数据,并根据bloc的状态使用。我正确更改主页UI??感谢您的解释。我成功实现了该场景。
  @override
  void initState() {
    super.initState();
    _menuBloc = BlocProvider.of<MenuBloc>(context);
    _menuBloc.add(ModuleInitialized());
  }