Десериализация флаттера с использованием обобщенных ошибок - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь десериализовать и сериализовать обобщенный класс c во флаттере, используя build_runner. Код, который я написал, выглядит следующим образом:

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

1 Ответ

0 голосов
/ 12 марта 2020

Пожалуйста, переместите методы _dataFromJson & _dataToJson за пределы класса 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,
    };

Надеюсь, это поможет!

...