flutter - rxDart 没有调用 onError
问题描述
我正在尝试使用 rxDart 向后端发出一个简单的请求。但是我面临的问题是,当我收到诸如 404 之类的 http 错误时,不会调用 onError,但是,可以在 onData 中将其提取出来。
我对 RxJava + 改造有一点经验,它可以按预期工作,当有一个错误响应时,http 状态代码 onError 被调用并且可以适当地处理。
1.我做错了什么,或者是故意的行为?
Object sendProfileData() {
Stream<Response> stream = onboardingRepository.createUser(User(name: 'name', surname: 'surname', lat: 1.0, lng: 2.0));
stream.listen((response) {
print(response.statusCode);
setAttributes();
}, onError: (e) {
print(e);
});
}
OnboardingRepository.dart:
class OnboardingRepository {
Observable<Response> createUser(User user) {
return Observable.fromFuture(TMApi.createUser(user));
}
}
TMApi.dart:
class TMApi {
static Future<http.Response> createUser(User user) async {
String url = '$baseUrl/create_user';
return await http.post(url, body: json.encode(user.toJson()));
}
}
在视图中处理事件的最佳方式是什么?如果发生错误应该显示错误,否则应该打开一个新屏幕。sendProfileData() 方法将返回一个对象,基于我将在视图中执行操作,但这听起来不是一个非常优雅的解决方案......
欢迎任何关于架构的建议:)
解决方案
dart 中的 http 库与 Retrofit 有点不同。
Future
返回的只有http.post
在出现 io 错误(socket 错误,没有 internet)时才会抛出异常。
像 404 这样的服务器响应反映在http.Response
.
我创建了一个简单的便捷方法,可能会对您有所帮助:
void throwIfNoSuccess(http.Response response) {
if(response.statusCode < 200 || response.statusCode > 299) {
print('http error!');
print(response.body);
throw new HttpException(response);
}
}
class HttpException implements Exception {
HttpException(this.response);
http.Response response;
}
如何使用:
import 'dart:convert';
import 'package:http/http.dart' as http;
Future<UserProfile> getUserProfile(String userId) async {
final url = 'https://example.com/api/users/$userId';
final response = await http.get(url);
throwIfNoSuccess(response);
final jsonBody = json.decode(response.body);
return UserProfile.fromJson(jsonBody);
}
推荐阅读
- css - 具有多个相同宽度的自动列的 CSS Grid
- numpy - 如何一次构建一个numpy矩阵一行?
- android - Android 11 用户无法授予后台位置权限?
- webp - 将png转换为webp后动画丢失
- node.js - 这有可能解决复杂的猫鼬填充查询吗?
- python - Word 嵌入,数据格式不确定如何组合
- jquery - jQuery Sortable 连接两个列表。我可以使第一个列表不可排序但将项目复制到第二个列表吗?第二个列表是可排序的
- c# - 如何在 C# 中将数组转换为 openCV Mat 对象?
- python - 使用 tensorflow 的数据集 API 使数据在现场可用
- wpf - 使用异步时 Thread.CurrentThread.CurrentUICulture 更改 .net 4.8