【问题标题】:Handling Errors with Dio/bloc Flutter使用 Dio/bloc Flutter 处理错误
【发布时间】:2020-01-17 08:09:15
【问题描述】:

在使用 Dio 请求时,我需要一种处理错误的好方法。 我可以在一堂课上完成并通过 dio 请求 throw it 吗? 它应该返回带有错误的响应。

【问题讨论】:

    标签: flutter error-handling bloc


    【解决方案1】:

    我在这里发布了我的通用网络集团,它可以在任何时间、任何地点重复使用。此外,它使用 dio 使用 API 存储库、异常和错误处理。

    class NetworkBloc extends Bloc<NetworkEvent, NetworkState> {
      NetworkBloc() : super(NetworkRequestInitial());
    
      @override
      Stream<NetworkState> mapEventToState(
        NetworkEvent event,
      ) async* {
        yield NetworkRequestInitiated();
        if (event is NetworkCallEvent) {
          RequestType requestType = event.requestType;
          if (requestType == RequestType.GET) {
            yield* fetchData(event);
          } else if (requestType == RequestType.POST) {
            yield* uploadDataAndStoreResult(event);
          }
        }
      }
    
      Stream<NetworkState> fetchData(NetworkCallEvent event) async* {
        Response response;
        try {
          yield NetworkRequestLoading();
          response =
              await event.apiRepository.sendGetRequest(event.url, event.request);
          if (response.statusCode == 200) {
            yield NetworkRequestLoaded(response: response);
          } else {
            Map jsonResponse = jsonDecode(response.data);
            yield NetworkRequestFailure(message: jsonResponse['message']);
          }
        } catch (e) {
          yield NetworkRequestFailure(
              message: NetworkUtils.getErrorMessageAccordingToError(e));
        }
      }
    
      Stream<NetworkState> uploadDataAndStoreResult(NetworkCallEvent event) async* {
        Response response;
        try {
          yield NetworkRequestLoading();
          if (event.request != null) {
            if (event.isHeadersNeeded) {
              response = await event.apiRepository.sendPostRequestWithHeader(
                event.url,
                request: event.request,
              );
            } else {
              response = await event.apiRepository.sendPostRequest(
                event.url,
                event.request,
              );
            }
          } else {
            response = await event.apiRepository
                .sendPostRequestWithoutBodyParameters(event.url);
          }
          if (response.statusCode == 200) {
            saveDataAccordingToCacheMechanism(event, response);
            yield NetworkRequestLoaded(response: response);
          } else {
            Map jsonResponse = jsonDecode(response.data);
            yield NetworkRequestFailure(message: jsonResponse['message']);
          }
        } catch (e) {
          yield NetworkRequestFailure(
              message: NetworkUtils.getErrorMessageAccordingToError(e));
        }
      }
    
      void saveDataAccordingToCacheMechanism(
          NetworkCallEvent event, Response response) async {
        if (event.cacheMechanism == CacheMechanism.SharePreferences) {
          Hive.box(ConstUtils.dbName)
              .put(event.keyForSharedPreferences, response.data.toString());
        } else if (event.cacheMechanism == CacheMechanism.Database) {}
      }
    }
    

    我还添加了状态和事件以使其更易于理解。

    class NetworkCallEvent extends NetworkEvent {
      final String request;
      final dynamic url;
      final RequestType requestType;
      final CacheMechanism cacheMechanism;
      final String keyForSharedPreferences;
      final APIRepository apiRepository;
      final bool isHeadersNeeded;
    
      NetworkCallEvent(
          {@required this.url,
          this.request,
          this.isHeadersNeeded = false,
          @required this.requestType,
          @required this.apiRepository,
          @required this.cacheMechanism,
          this.keyForSharedPreferences});
    
      @override
      List<Object> get props => [
            this.url,
            this.request,
            this.requestType,
            this.cacheMechanism,
            this.keyForSharedPreferences,
            this.apiRepository
          ];
    }
    

    Network_states:

    class NetworkRequestInitial extends NetworkState {}
    
    class NetworkRequestInitiated extends NetworkState {}
    
    class NetworkRequestLoading extends NetworkState {}
    
    class NetworkRequestLoaded extends NetworkState {
      final dynamic response;
    
      NetworkRequestLoaded({this.response});
    
      @override
      List<Object> get props => [this.response];
    }
    
    class NetworkRequestFailure extends NetworkState {
      final String message;
    
      NetworkRequestFailure({this.message});
    
      @override
      List<Object> get props => [this.message];
    }
    

    您可以轻松地以 JSON 格式发送请求并获得动态响应,您可以使用 json.decode() 将其转换为适当的对象。

    【讨论】:

      猜你喜欢
      • 2019-12-18
      • 2019-10-26
      • 2023-02-20
      • 2021-09-06
      • 2023-01-28
      • 2021-09-07
      • 2023-03-12
      • 2021-03-04
      • 1970-01-01
      相关资源
      最近更新 更多