gpt4 book ai didi

flutter - rxDart 没有调用 onError

转载 作者:IT王子 更新时间:2023-10-29 06:54:51 26 4
gpt4 key购买 nike

我正在尝试使用 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()));
}
}
  1. 在 View 中处理事件的最佳方式是什么?如果发生错误,应该显示错误,否则应该打开一个新屏幕。 sendProfileData() 方法将返回一个对象,基于该对象我将在 View 中执行操作,但这听起来不像是一个非常优雅的解决方案...

  2. 欢迎就架构提出任何建议:)

最佳答案

dart 中的 http 库与 Retrofit 有点不同。

http.post 返回的Future 仅在出现 io 错误(套接字错误,无互联网)时抛出异常。

像 404 这样的服务器响应反射(reflect)在 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);
}

关于flutter - rxDart 没有调用 onError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52117308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com