flutter 我如何在dart中引用一个用freezed实现JsonSerialized的通用对象

rbl8hiat  于 2023-05-23  发布在  Flutter
关注(0)|答案(1)|浏览(277)

我使用https://pub.dev/packages/freezed来用json生成数据类。
我想这样做,这样我就可以在类中使用toJson()

class DatabaseRepository<T extends JsonSerializable> { ... }

但是当我定义泛型时,我得到了错误:'Prompt' doesn't conform to the bound 'JsonSerializable' of the type parameter 'T'. Try using a type that is or is a subclass of 'JsonSerializable'

Prompt的定义如下:

import 'package:freezed_annotation/freezed_annotation.dart';

part 'prompt.freezed.dart';
part 'prompt.g.dart';

@freezed
class Prompt with _$Prompt {
  const factory Prompt({
    required String text,
    String? id,
    @Default(false) bool archived,
  }) = _Prompt;

  factory Prompt.fromJson(Map<String, dynamic> json) => _$PromptFromJson(json);
}

JsonSerializable是要扩展的错误类吗?还是说这是不可能做到的?

8ehkhllq

8ehkhllq1#

JsonSerializable用作注解,而不是基类。因此,它没有扩展,因此不适合作为类型绑定。
作为替代方案,您可以创建一个抽象类,提供toJson方法的定义,让Prompt实现它并将其用作泛型类型绑定,例如。

abstract class JsonObject {
    Map<String, dynamic> toJson();
}

@freezed
class Prompt with _$Prompt implements JsonObject {
    …
    Map<String, dynamic> toJson() => _$PromptToJson(this);
    …

}

class DatabaseRepository<T extends JsonObject> { … }

参见How to enforce Implements constraint on generic type T in generic Dart method?

相关问题