flutter - Flutter 反序列化使用泛型错误
问题描述
我正在尝试使用 build_runner 反序列化和序列化 Flutter 中的泛型类。我写的代码如下:
import 'package:json_annotation/json_annotation.dart';
import 'api_response_message_model.dart';
part 'api_response_base_model.g.dart';
@JsonSerializable()
class ApiResponseBaseModel<T> {
@JsonKey(fromJson: _dataFromJson, toJson: _dataToJson)
T data;
ApiResponseMessageModel message;
ApiResponseBaseModel({this.data, this.message});
factory ApiResponseBaseModel.fromJson(Map<String, dynamic> json) =>
_$ApiResponseBaseModelFromJson(json);
T _dataFromJson<T>(Map<String, dynamic> input) =>
input['value'] as T;
Map<String, dynamic> _dataToJson<T>(T input) =>
{'value': input};
}
运行命令时出现如下错误flutter packages pub run build_runner build --delete-conflicting-outputs
Could not generate `fromJson` code for `data`.
None of the provided `TypeHelper` instances support the defined type.
package:premier_app/models/api_response_base_model.dart:10:5
╷
10│ T data;
│ ^^^^
╵
请帮我找出问题并知道正确的解决方案。
我也尝试过这里提到的方法,但没有运气消除错误 - https://github.com/dart-lang/json_serializable/blob/7b40e9b04805bf921e4cebb87ec4ad7b8e1a2d29/json_serializable/test/generic_files/generic_class.dart#L20-L21
解决方案
请将_dataFromJson
&_dataToJson
方法移到 class 范围之外ApiResponseBaseModel<T>
。
例子:
import 'package:json_annotation/json_annotation.dart';
import 'api_response_message_model.dart';
part 'api_response_base_model.g.dart';
@JsonSerializable()
class ApiResponseBaseModel<T> {
@JsonKey(fromJson: _dataFromJson, toJson: _dataToJson)
T data;
ApiResponseMessageModel message;
ApiResponseBaseModel({this.data, this.message});
factory ApiResponseBaseModel.fromJson(Map<String, dynamic> json) =>
_$ApiResponseBaseModelFromJson(json);
}
T _dataFromJson<T>(Map<String, dynamic> input) =>
input['value'] as T;
Map<String, dynamic> _dataToJson<T>(T input) =>
{'value': input};
我自己也试过了,好用!生成的方法如下所示:
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'api_response_base_model.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
ApiResponseBaseModel<T> _$ApiResponseBaseModelFromJson<T>(
Map<String, dynamic> json) {
return ApiResponseBaseModel<T>(
data: _dataFromJson(json['data'] as Map<String, dynamic>),
message: json['message'],
);
}
Map<String, dynamic> _$ApiResponseBaseModelToJson<T>(
ApiResponseBaseModel<T> instance) =>
<String, dynamic>{
'data': _dataToJson(instance.data),
'message': instance.message,
};
希望有帮助!
推荐阅读
- authorization - Swift 5 HttpRequest 授权不记名令牌
- ruby-on-rails - Rails 6 的 RSpec 测试问题
- python - 与postgres的数据库连接在python语言的服务器中不断断开
- javascript - 如何设置特定的预加载器
- amazon-web-services - 云端 CORS 问题和缓存失效
- webview - 如何更新 AWS 设备场中的系统应用程序?
- php - wordpress 错误没有这样的文件或目录 wp-settings.php 第 174 行
- rest - 通过完全限定域名而不是 IP 地址访问部署在集群上的应用程序
- r - 将 data.frame 从 AAABBBCCC 重新排序为 ABCABCABC
- android - How to store large size texts in a TextView