• flutter plugins插件【一】【FlutterJsonBeanFactory】


    注意:

    5.1.3版本,新生成一个entity的话需要重新运行flutter项目才行,否则

    JsonConvertClassCollection不会重建,进而导致convertFuncMap也不会重建,从而出现不能转模型的报错

    1、FlutterJsonBeanFactory

    在Setting->Tools->FlutterJsonBeanFactory里边自定义实体类的后缀,默认是entity

    复制json到粘贴板,右键自己要存放实体的目录,可以看到JsonToDartBeanAction

    Class Name是实体名字,会默认加上entity
    JSON TextJson文本
    null-able勾选后所有属性都是可空的?,不勾选都会加上late,延迟初始化

    执行Make后生成代码目录如下:
    models项目自建,存放实体
    generated/json是插件生成目录,xx_entity.g.daet是实体类生成的辅助类方法, base是存放基础公共代码

    后台返回的数据一般是经过一层包装

    1. {
    2. "code": 200,
    3. "message": "success",
    4. "data":{
    5. "id": "1",
    6. "name": "qi1",
    7. "age": 18
    8. }
    9. }

    而重新用插件生成会生成如下代码:

    1. @JsonSerializable()
    2. class ApiResponseEntity {
    3. int? code;
    4. String? message;
    5. ApiResponseData? data;
    6. ApiResponseEntity();
    7. factory ApiResponseEntity.fromJson(Map<String, dynamic> json) => $ApiResponseEntityFromJson(json);
    8. Map<String, dynamic> toJson() => $ApiResponseEntityToJson(this);
    9. @override
    10. String toString() {
    11. return jsonEncode(this);
    12. }
    13. }
    14. @JsonSerializable()
    15. class ApiResponseData {
    16. String? id;
    17. String? name;
    18. int? age;
    19. ApiResponseData();
    20. factory ApiResponseData.fromJson(Map<String, dynamic> json) => $ApiResponseDataFromJson(json);
    21. Map<String, dynamic> toJson() => $ApiResponseDataToJson(this);
    22. @override
    23. String toString() {
    24. return jsonEncode(this);
    25. }
    26. }

    要是这样,每一个接口的都有一个ResponseEntity,使用起来不便于统一封装。
    所以我们可以把ApiResponseData换成 dynamic,文件底部的ApiResponseData信息也全部删除,再执行Alt+J,这样就会自动清理掉整理json_convert_content.dartapi_response_entity.g.dart中的ApiResponseData痕迹。再把dynamic替换成T,并且去除顶部的@JsonSerializable(),避免下次执行Alt+J,替换掉自己的自定义。

    1. @JsonSerializable()
    2. class ApiResponseEntity<T> {
    3. late int code;
    4. late String message;
    5. late T data;
    6. ApiResponseEntity();
    7. factory ApiResponseEntity.fromJson(Map<String, dynamic> json) =>
    8. $ApiResponseEntityFromJson<T>(json);
    9. Map<String, dynamic> toJson() => $ApiResponseEntityToJson(this);
    10. @override
    11. String toString() {
    12. return jsonEncode(this);
    13. }
    14. }
    1. ApiResponseEntity<T> $ApiResponseEntityFromJson<T>(Map<String, dynamic> json) {
    2. final ApiResponseEntity<T> apiResponseEntity = ApiResponseEntity<T>();
    3. final int? code = jsonConvert.convert<int>(json['code']);
    4. if (code != null) {
    5. apiResponseEntity.code = code;
    6. }
    7. final String? message = jsonConvert.convert<String>(json['message']);
    8. if (message != null) {
    9. apiResponseEntity.message = message;
    10. }
    11. final T data = jsonConvert.convert<dynamic>(json['data']);
    12. if (data != null) {
    13. apiResponseEntity.data = data;
    14. }
    15. return apiResponseEntity;
    16. }
    17. Map<String, dynamic> $ApiResponseEntityToJson(ApiResponseEntity entity) {
    18. final Map<String, dynamic> data = <String, dynamic>{};
    19. data['code'] = entity.code;
    20. data['message'] = entity.message;
    21. data['data'] = entity.data;
    22. return data;
    23. }

    并且把api_response_entity.g.dart移除generated目录,因为那个目录会自动删除无用的文件。可以和api_reponse_entity.dart单独存放在一个文件夹当中。

    优化后使用

    第一次发现,reponse的data是null。因为新的插件在 asT方法没有去调用fromJsonAsT,这个需要我们自加上,否则会失败。

    1. if (_convertFuncMap.containsKey(type)) {
    2. return _convertFuncMap[type]!(value) as T;
    3. } else {
    4. return fromJsonAsT<T>(value);
    5. // throw UnimplementedError('$type unimplemented');
    6. }
    1. //单实体
    2. String responseData1 = """
    3. {
    4. "code": 200,
    5. "message": "success",
    6. "data":{
    7. "id": 1,
    8. "name": "qi1",
    9. "age": 21
    10. }
    11. }
    12. """;
    13. //List
    14. String responseData2 = """
    15. {
    16. "code": 200,
    17. "message": "success",
    18. "data":[
    19. {
    20. "id": 1,
    21. "name": "qi1",
    22. "age": 21
    23. },{
    24. "id": 2,
    25. "name": "qi2",
    26. "age": 22
    27. }
    28. ]
    29. }
    30. """;
    31. //基础数据类型
    32. String responseData3 = """
    33. {
    34. "code": 200,
    35. "message": "success",
    36. "data": 18
    37. }
    38. """;
    39. _apiResponseDecode() {
    40. setState(() {
    41. response1 = ApiResponseEntity.fromJson(jsonDecode(responseData1));
    42. response2 = ApiResponseEntity.fromJson(jsonDecode(responseData2));
    43. response3 = ApiResponseEntity.fromJson(jsonDecode(responseData3));
    44. });
    45. }
    46. _getApiResponseContent() {
    47. return response1.toString() +
    48. "\n" +
    49. response2.toString() +
    50. "\n" +
    51. response3.toString();
    52. }

    如果修改了某个entity中的某个字段   或者  需要重新生成.g.dart和json_convert_content.dart

    只需要Alt + j 快捷键即可

    参考链接:https://juejin.cn/post/7043721908801503269

  • 相关阅读:
    【NodeJs-5天学习】第一天篇① —— 第一次认识NodeJs
    C++之I/0流操作(标准流、文件流、二进制操作等)
    第04章 逻辑架构【1.MySQL架构篇】【MySQL高级】
    【神经网络】GAN:生成对抗网络
    .Net Core 配置文件读取 - IOptions、IOptionsMonitor、IOptionsSnapshot
    私信功能的设计与实现
    SSM三大框架之MyBatis总结【动力节点老杜】
    人工智能知识全面讲解: 人脸识别技术
    Nginx配置HTTPS
    vue3+vite如何兼容低版本的白屏问题(安卓7/ios11)
  • 原文地址:https://blog.csdn.net/allanGold/article/details/132636767