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