我只是在学习Riverpod,我不确定如何处理来自API请求的状态代码.我还没有找到任何优雅地处理这一问题的好例子.我正在开发一个简化的登录测试来解决这个问题:
final LoginAsyncProvider = AsyncNotifierProvider.autoDispose<LoginProvider, User>(() {
return LoginProvider();
});
class LoginProvider extends AutoDisposeAsyncNotifier<User> {
FutureOr<User> login({required String userName, required String password}) async {
final response = await http.post(Uri.https(Api.mainDomain, Api.login));
final json = jsonDecode(response.body) as Map<String, dynamic>;
User _user = User.fromJson(json);
state = AsyncData(_user);
return _user;
}
@override
FutureOr<User> build() async {
return login(userName: "someUser", password: "somePass"); }
}
我想在用户界面的Switch语句中使用它:
...
child: switch (userAsyncValue) {
AsyncData(:final value) => Text(text: userAsyncValue.userName),
AsyncError() => const Text('Some Error happened'),
_ => const CircularProgressIndicator(),
},
...
显然,当response.statusCode!=200
与不在response.body
中返回数据时,这在语句final json = jsonDecode(response.body) as Map<String, dynamic>;
上失败.
处理API请求失败的正确方法是什么?