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

  2. 欢迎任何关于架构的建议:)

标签: flutterstreamrxdart

解决方案


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);
}

推荐阅读