Flutter 中的通用类

Lak*_*ani 1 dart flutter

我有一个来自这样的 http 请求的通用响应结构

class CommonResponse<T> {
  int total;
  List<T> data;
  bool success;

  CommonResponse({this.total, this.data, this.success});

  CommonResponse.fromJson(Map<String, dynamic> json) {
    total = json['total'];
    data = json['data'];

    success = json['success'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['total'] = this.total;
    data['data'] = this.data;
    data['success'] = this.success;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我需要解析通用数据。例如,我正在获取数据对象内的区域列表CommonResponse

class Zone {
  bool active;
  String id;
  String name;

  Zone({this.active, this.id, this.name});

  Zone.fromJson(Map<String, dynamic> json) {
    this.active = json['active'];
    this.id = json['id'];
    this.name = json['name'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['active'] = this.active;
    data['id'] = this.id;
    data['name'] = this.name;
  }
}
Run Code Online (Sandbox Code Playgroud)

如何获取区域列表?

  var response = {
    "data": [
      {
        "active": true,
        "created_on": "2020-03-12T09:56:11+00:00",
        "description": "For Testing",
        "id": "b17627eb-8a39-4230-80fe-ebed77f7e0e2",
        "name": "Office",
        "updated_on": "2020-03-19T12:26:16+00:00"
      }
    ],
    "success": true,
    "total": 1
  };
  CommonResponse<Zone> common = CommonResponse.fromJson(response);
  print(common.data);
Run Code Online (Sandbox Code Playgroud)

这是我试过的。我得到了完美的回应,但在获取Zone. 错误是无法转换List<dynamic>Zone.

Owc*_*zar 10

要生成从 json 到 json 的正确转换,您可以使用json_serializable包。它通过@JsonSerializable(genericArgumentFactories: true).

首先让我们进行小代码重构:

Zone班级移至zone.dart

import 'package:json_annotation/json_annotation.dart';

part 'zone.g.dart';

@JsonSerializable()
class Zone {
  bool active;
  String id;
  String name;

  Zone({this.active, this.id, this.name});

  factory Zone.fromJson(Map<String, dynamic> json) => _$ZoneFromJson(json);
  Map<String, dynamic> toJson() => _$ZoneToJson(this);
}
Run Code Online (Sandbox Code Playgroud)

CommonResponse 上课到 common_response.dart

import 'package:json_annotation/json_annotation.dart';

part 'common_response.g.dart';

@JsonSerializable(genericArgumentFactories: true)
class CommonResponse<T> {
  int total;
  List<T> data;
  bool success;

  CommonResponse({this.total, this.data, this.success});

  factory CommonResponse.fromJson(
    Map<String, dynamic> json,
    T Function(Object json) fromJsonT,
  ) =>
      _$CommonResponseFromJson(json, fromJsonT);
  Map<String, dynamic> toJson(Object Function(T value) toJsonT) =>
      _$CommonResponseToJson(this, toJsonT);
}
Run Code Online (Sandbox Code Playgroud)

并运行flutter pub run build_runner build

输出如下:

zone.g.dart

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'zone.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

Zone _$ZoneFromJson(Map<String, dynamic> json) {
  return Zone(
    active: json['active'] as bool,
    id: json['id'] as String,
    name: json['name'] as String,
  );
}

Map<String, dynamic> _$ZoneToJson(Zone instance) => <String, dynamic>{
      'active': instance.active,
      'id': instance.id,
      'name': instance.name,
    };

Run Code Online (Sandbox Code Playgroud)

common_response.g.dart

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'common_response.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

CommonResponse<T> _$CommonResponseFromJson<T>(
  Map<String, dynamic> json,
  T Function(Object json) fromJsonT,
) {
  return CommonResponse<T>(
    total: json['total'] as int,
    data: (json['data'] as List)?.map(fromJsonT)?.toList(),
    success: json['success'] as bool,
  );
}

Map<String, dynamic> _$CommonResponseToJson<T>(
  CommonResponse<T> instance,
  Object Function(T value) toJsonT,
) =>
    <String, dynamic>{
      'total': instance.total,
      'data': instance.data?.map(toJsonT)?.toList(),
      'success': instance.success,
    };
Run Code Online (Sandbox Code Playgroud)

示例用法:

import 'package:json_annotation/json_annotation.dart';

part 'zone.g.dart';

@JsonSerializable()
class Zone {
  bool active;
  String id;
  String name;

  Zone({this.active, this.id, this.name});

  factory Zone.fromJson(Map<String, dynamic> json) => _$ZoneFromJson(json);
  Map<String, dynamic> toJson() => _$ZoneToJson(this);
}
Run Code Online (Sandbox Code Playgroud)

  • 这很有用,但是我必须将最后一部分更改为“CommonResponse&lt;Zone&gt;.fromJson(response, (data) =&gt; Zone.fromJson(data as Map&lt;String,dynamic&gt;));” (6认同)