【发布时间】:2021-12-10 17:33:18
【问题描述】:
我已经冻结了模型(简化):
part 'initial_data_model.freezed.dart';
part 'initial_data_model.g.dart';
@freezed
class InitialDataModel with _$InitialDataModel {
const factory InitialDataModel() = Data;
const factory InitialDataModel.loading() = Loading;
const factory InitialDataModel.error([String? message]) = Error;
factory InitialDataModel.fromJson(Map<String, dynamic> json) => _$InitialDataModelFromJson(json);
}
文档说明了如何在字段而不是模型本身上分配自定义转换器
我从后端和 api_provider 的某个地方得到了 jsonreturn InitialDataModel.fromJson(json);
我无法控制 json 结构,没有“runtimeType”和其他愚蠢的冗余东西
当我想从 json 创建模型时,我调用 fromJson 我有这个
flutter: CheckedFromJsonException
Could not create `InitialDataModel`.
There is a problem with "runtimeType".
Invalid union type "null"!
好的,再次
我有api_provider
final apiProvider = Provider<_ApiProvider>((ref) => _ApiProvider(ref.read));
class _ApiProvider {
final Reader read;
_ApiProvider(this.read);
Future<InitialDataModel> fetchInitialData() async {
final result = await read(repositoryProvider).send('/initial_data');
return result.when(
(json) => InitialDataModel.fromJson(json),
error: (e) => InitialDataModel.error(e),
);
}
}
你可能会看到我正在尝试从 json 创建 InitialDataModel
这行抛出了我上面提到的错误
我不明白如何从 json 创建 InitialDataModel,现在在我的示例中它只是空模型,没有字段
(json) => InitialDataModel.fromJson(json),json 这里是 Map,即使我传递简单的空地图 {} 而不是真正的 json 对象,它也会显示错误
【问题讨论】:
-
您是否使用
serializable包来生成fromJson方法? -
为什么您需要为整个模型定制转换器?使用自定义转换器注释每个非原始字段就足够了
-
您需要将
json_serializable添加到您的pubspecdev_dependencies。如果您的冻结类中有fromJson工厂构造函数,则此包将生成 json 转换所需的代码。并且您的非原始字段必须使用自定义 json-converters 进行注释 -
您的类型似乎有问题。转换仅适用于原始类型,如 int、string、double 或带注释的非原始类型。因此,您必须为
CountryModel和CityModel编写一个json 转换器并相应地注释这些字段。 -
您要转换哪种类型的
json变量?String还是Map<String, dynamic>?如果是String,则必须先转换flutter.dev/docs/development/data-and-backend/…
标签: flutter jsonserializer jsonconvert freezed