美文网首页
分页对象通用page的bean编写

分页对象通用page的bean编写

作者: 锦鲤跃龙 | 来源:发表于2020-10-17 11:27 被阅读0次

    问题描述

    • 我们做分页请求的时候,后台返回的数据格式类似这种


      image.png

    后端采用了泛型的方式。

    • 之前flutter解析的时候,我们需要对这个进行序列化


      image.png
    • 如果仅仅有一个接口还好,但是如果有多个分页的接口,每一个接口都需要编写两个bean文件,导致文件过多,而且做了很多重复工作

    思路

    观察原来的bean类,核心在MineWalletPageDtoSerializer

    // GENERATED CODE - DO NOT MODIFY BY HAND
    
    part of 'mine_wallet_month_pay_page_dto.dart';
    
    // **************************************************************************
    // JaguarSerializerGenerator
    // **************************************************************************
    
    abstract class _$MineWalletPageDtoSerializer
        implements Serializer<MineWalletPageDto> {
      Serializer<MinePayRecordDto> __minePayRecordDtoSerializer;
      Serializer<MinePayRecordDto> get _minePayRecordDtoSerializer =>
          __minePayRecordDtoSerializer ??= MinePayRecordDtoSerializer();
      @override
      Map<String, dynamic> toMap(MineWalletPageDto model) {
        if (model == null) return null;
        Map<String, dynamic> ret = <String, dynamic>{};
        setMapValue(ret, 'currentPage', model.currentPage);
        setMapValue(ret, 'pageSize', model.pageSize);
        setMapValue(ret, 'totalRow', model.totalRow);
        setMapValue(ret, 'totalPage', model.totalPage);
        setMapValue(
            ret,
            'result',
            codeIterable(
                model.result,
                (val) =>
                    _minePayRecordDtoSerializer.toMap(val as MinePayRecordDto)));
        return ret;
      }
    
      @override
      MineWalletPageDto fromMap(Map map) {
        if (map == null) return null;
        final obj = MineWalletPageDto();
        obj.currentPage = map['currentPage'] as int;
        obj.pageSize = map['pageSize'] as int;
        obj.totalRow = map['totalRow'] as int;
        obj.totalPage = map['totalPage'] as int;
        obj.result = codeIterable<MinePayRecordDto>(map['result'] as Iterable,
            (val) => _minePayRecordDtoSerializer.fromMap(val as Map));
        return obj;
      }
    }
    
    

    需要每次把需要的reult中的列表类型定好,传进去,
    可以考虑通过泛型的方式,把类型作为参数传进去,编写一个通用的pageDto

    解决方案

    所以需要一个可以适配多中page的通用pageDto实现,考虑可以通过泛型的方式,把类型作为参数传进去

    import 'package:jaguar_serializer/jaguar_serializer.dart';
    part 'common_page_dto.jser.dart';
    
    
    class CommonPageDto<T> {
      int currentPage;
      int pageSize;
      int totalRow;
      int totalPage;
      List<T> result;
      CommonPageDto({this.currentPage, this.pageSize, this.totalRow, this.totalPage, this.result});
    
     
    }
    
    
    part of 'common_page_dto.dart';
    
    class CommonPageDtoSerializer<T> {
      Serializer<T> recordDtoSerializer;
      CommonPageDtoSerializer({this.recordDtoSerializer});
      Map<String, dynamic> toMap(CommonPageDto model) {
        if (model == null) return null;
        Map<String, dynamic> ret = <String, dynamic>{};
        setMapValue(ret, 'currentPage', model.currentPage);
        setMapValue(ret, 'pageSize', model.pageSize);
        setMapValue(ret, 'totalRow', model.totalRow);
        setMapValue(ret, 'totalPage', model.totalPage);
        setMapValue(ret, 'result',
            codeIterable(model.result, (val) => this.recordDtoSerializer.toMap(val as T)));
        return ret;
      }
      CommonPageDto fromMap(Map map) {
        if (map == null) return null;
        final obj = CommonPageDto();
        obj.currentPage = map['currentPage'] as int;
        obj.pageSize = map['pageSize'] as int;
        obj.totalRow = map['totalRow'] as int;
        obj.totalPage = map['totalPage'] as int;
        obj.result = codeIterable<T>(
            map['result'] as Iterable, (val) => this.recordDtoSerializer.fromMap(val as Map));
        return obj;
      }
    }
    

    使用方法

    CommonPageDto<MinePayRecordDto> pageDto = CommonPageDtoSerializer(recordDtoSerializer: MinePayRecordDtoSerializer()).fromMap(res.data);
     
    

    之前调用

    MineWalletPageDto pageDto = MineWalletPageDtoSerializer().fromMap(res.data);
    

    优点

    1. 两个文件实现多个接口类型的分页数据
    2. 一行代码实现序列化

    相关文章

      网友评论

          本文标题:分页对象通用page的bean编写

          本文链接:https://www.haomeiwen.com/subject/wubxmktx.html