【问题标题】:A common request method with decoder passed as parameter in Flutter using Dio使用 Dio 在 Flutter 中作为参数传递解码器的常见请求方法
【发布时间】:2022-01-25 14:14:00
【问题描述】:

不知道如果我是一个愚蠢的吞食者我想做什么?在应用程序中,我使用休息 API 调用并尝试使用 Dio 实现 API 处理。 我采用了这样的方法。

每个 API 方法都有一个通用函数。即:POST 方法。像

Future<dynamic> postRequest({String? endPoint, dynamic decoder, data}) async {
    // late String _fullURL = BaseOptions().baseUrl + endPoint!;
    late int? _responseCode;
    try {
      final response = await _dio.post(
        endPoint!, // APIEndpoints.postSignUp,
        data: data, //jsonEncode(data),
      );
      //
      // final String _responseString = response.data;
      _responseCode = response.statusCode;
      //
      if (_responseCode == 200) {
        final String _responseString = response.data;
        final res = decoder(_responseString);
        log("post success response ------------ ${res.toString()}");
        return SuccessHandler().checkSuccess(res);
      } else if (_responseCode == 201) {
        log("post success no response ------------ ");
        return HTTPResponse<dynamic>(
          false,
          null,
          message: 'empty success',
          code: _responseCode!,
          //'Something went wrong! Please try again in a moment!',
        );
      } else {
        log("post failed response ------------ ");
        return null;
        // return ErrorHandler().checkError(_responseCode, _responseString);
      }
    } on DioError catch (e) {
      // print(e.message);
      // throw Exception(e.message);
      log("exception ------------ ${e.message}");
      return HTTPResponse<dynamic>(
        false,
        null,
        message: 'error: ${e.message}',
        code: e.response!.statusCode!,
        //'Something went wrong! Please try again in a moment!',
      );
    }
  }

我尝试通过解码器来获取从 API 响应中读出的 json 响应。使用这样的生成类

ValidateEmailModel validateEmailModelFromJson(String str) =>
    ValidateEmailModel.fromJson(json.decode(str));

String validateEmailModelToJson(ValidateEmailModel data) =>
    json.encode(data.toJson());

class ValidateEmailModel {
  ValidateEmailModel({
    this.email,
    this.type,
    this.code,
    this.expire,
    this.createdTime,
  });

  String? email;
  String? type;
  String? code;
  dynamic expire;
  dynamic createdTime;

  factory ValidateEmailModel.fromJson(Map<String, dynamic> json) =>
      ValidateEmailModel(
        email: json["email"],
        type: json["type"],
        code: json["code"],
        expire: DateTime.parse(json["expire"].toString()),
        createdTime: DateTime.parse(json["createdTime"].toString()),
      );

  Map<String, dynamic> toJson() => {
        "email": email,
        "type": type,
        "code": code,
        "expire": expire!.toIso8601String(),
        "createdTime": createdTime!.toIso8601String(),
      };
}

在我的方法调用中。我给函数它的参数是这样的

res = await APIHandler.instance.postRequest(
                endPoint: APIEndpoints.postValidateCode,
                decoder: validateEmailModelFromJson,
                data: {
                  "code": val,
                  "email": _email,
                },
              )

并等待将响应传递给另一个常用方法 SuccessHandler(),以便我可以获取数据对象/s

class SuccessHandler {
  dynamic successObject;

  SuccessHandler({this.successObject});

  Future<dynamic> checkSuccess(dynamic response) async {
    return SuccessHandler(successObject: response);
  }
}

到目前为止,当我尝试调试代码时。我确实从 Dio 响应中获得了 response.data。但给了我

Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String'

我能实现我需要的吗?如何更新代码。请帮我解决这个问题,或者我认为我想在这里重新发明轮子。

【问题讨论】:

  • 可以添加你得到的json响应
  • 你是什么意思?
  • 抱歉我的错,尝试直接解析 json 响应,因为你得到的是一个 json 而不是字符串,json.decode(str) 需要一个字符串来将它转换成 json 但你已经得到了 json 所以不需要使用它
  • 我可以在哪里更新?

标签: json flutter api dart dio


【解决方案1】:

validateEmailModelFromJson 这个函数将做的是将一个字符串转换为 json 并将它解析为你的数据模型,但在你 postRequest 函数中你已经从 api 调用得到一个 json 响应,所以不需要传递解码器对你起作用。

你在哪里返回SuccessHandler().checkSuccess(res);直接返回_responseString所以应该是这样的,

 if (_responseCode == 200) {
        final String _responseString = response.data;
        log("post success response ------------ 
        ${_responseString}");
        return SuccessHandler().checkSuccess(_responseString);
      }

现在试试在_responseString上直接使用ValidateEmailModel.fromJson,你会得到数据

【讨论】:

    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 2015-09-22
    • 2015-06-02
    • 2020-11-29
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多