首页 > 解决方案 > 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

标签: flutterdeserialization

解决方案


请将_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,
    };

希望有帮助!


推荐阅读