问题描述
-
我们做分页请求的时候,后台返回的数据格式类似这种
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);
优点
- 两个文件实现多个接口类型的分页数据
- 一行代码实现序列化
网友评论