Flutter rxDart未调用onError

Flutter rxDart未调用onError,flutter,stream,rxdart,Flutter,Stream,Rxdart,我正在尝试使用rxDart向后端发出一个简单的请求。但我面临的问题是,当我得到一个http错误,比如404时,不会调用onError,但是,可以在onData中提取它 我有一点RxJava+改造的经验,在那里,当有一个带有错误http状态代码的响应时,它会按预期工作。onError被调用,并且可以得到适当的处理 1。我做错了什么,还是故意的行为? Object sendProfileData() { Stream<Response> stream = onboarding

我正在尝试使用rxDart向后端发出一个简单的请求。但我面临的问题是,当我得到一个http错误,比如404时,不会调用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);
    });
  }
对象sendProfileData(){
Stream-Stream=onboardingRepository.createUser(用户(名称:'name',姓氏:'name',lat:1.0,lng:2.0));
stream.listen((响应){
打印(响应状态码);
setAttributes();
},onError:(e){
印刷品(e);
});
}
OnboardingRepository.dart:

class OnboardingRepository {
  Observable<Response> createUser(User user) {
    return Observable.fromFuture(TMApi.createUser(user));
  }
}
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()));
  }
}
class OnboardingRepository{
可观察的createUser(用户){
返回Observable.fromFuture(TMApi.createUser(用户));
}
}
TMApi.dart:

class OnboardingRepository {
  Observable<Response> createUser(User user) {
    return Observable.fromFuture(TMApi.createUser(user));
  }
}
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()));
  }
}
类TMApi{
静态未来createUser(用户用户)异步{
字符串url='$baseUrl/create_user';
return wait http.post(url,body:json.encode(user.toJson());
}
}
  • 在视图中处理事件的最佳方式是什么?如果出现错误,则应显示错误,否则应打开新屏幕。sendProfileData()方法将返回一个对象,基于此,我将在视图中执行操作,但这听起来不是一个非常优雅的解决方案

  • 欢迎对架构提出任何建议:)


  • dart中的http库的工作原理与改造略有不同

    http.post
    返回的
    Future
    仅在io错误(套接字错误,没有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;
    }
    
    void throwIfNoSuccess(http.Response){
    if(response.statusCode<200 | | response.statusCode>299){
    打印('http错误!');
    打印(响应.正文);
    抛出新的HttpException(响应);
    }
    }
    类HttpException实现异常{
    HttpException(this.response);
    http.响应;
    }
    
    如何使用:

    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);
    }
    
    导入'dart:convert';
    将“package:http/http.dart”导入为http;
    未来的getUserProfile(字符串用户ID)异步{
    最终url=https://example.com/api/users/$userId';
    最终响应=等待http.get(url);
    throwIfNoSuccess(响应);
    final jsonBody=json.decode(response.body);
    返回UserProfile.fromJson(jsonBody);
    }
    
    我不知道该把它放在哪里?你能解释一下吗?增加了用法示例;)