如何在 Flutter Dart 冻结模型中使用 Late Final 关键字?
这段代码生成成功,没有静态分析错误,但是编译不奇怪。
import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'fb_story.freezed.dart';
part 'fb_story.g.dart';
@freezed
class FbStory with _$FbStory {
FbStory._();
const factory FbStory({
required String id,
required String data_str,
@Default(false) bool imageNotAvailable,
@Default(false) bool videoNotAvailable,
String? imageUrl,
String? videoUrl,
}) = _FbStory;
late final Map<String, dynamic> data = jsonDecode(data_str);
factory FbStory.fromJson(Map<String, dynamic> json) =>
_$FbStoryFromJson(json);
}
错误:
Error: A constant constructor can't call a non-constant super constructor.
之前,Freezed 曾经率先使用
late
关键字和 @late
注释,所以我想应该有一种方法可以实现这项工作。上课还是冻结,只是懒惰
错误非常明显,你不能有一个带有
const
变量的 late
构造函数。这不是冻结的错误,正常的 Dart 类也会出现此错误:
class FbStory {
const FbStory(this.data_str);
final String data_str;
// Can't define the 'const' constructor because the field 'data'
// is initialized with a non-constant value.
late final Map<String, dynamic> data = jsonDecode(data_str);
}
要解决您的问题,我建议从您的
const
中删除 const factory FbStory(...)
。
或者您可以创建由 json_serialized提供的转换器类:
class StringToMapConverter implements JsonConverter<Map<String, dynamic>, String> {
const StringToMapConverter();
@override
Map<String, dynamic> fromJson(String json) {
return jsonDecode(json) as Map<String, dynamic>;
}
@override
String toJson(Map<String, dynamic> object) {
return jsonEncode(object);
}
}
您的班级
FbStory
将如下所示:
@freezed
class FbStory with _$FbStory {
FbStory._();
const factory FbStory({
required String id,
@JsonKey(name: 'data_str')
@StringToMapConverter()
required Map<String, dynamic> data,
@Default(false) bool imageNotAvailable,
@Default(false) bool videoNotAvailable,
String? imageUrl,
String? videoUrl,
}) = _FbStory;
只需删除
factory FbStory
处的 const
完整代码:
import 'dart:convert';
import 'package:freezed_annotation/freezed_annotation.dart';
part 'fb_story.freezed.dart';
part 'fb_story.g.dart';
@freezed
class FbStory with _$FbStory {
FbStory._();
factory FbStory({
required String id,
required String data_str,
@Default(false) bool imageNotAvailable,
@Default(false) bool videoNotAvailable,
String? imageUrl,
String? videoUrl,
}) = _FbStory;
late final Map<String, dynamic> data = jsonDecode(data_str);
factory FbStory.fromJson(Map<String, dynamic> json) =>
_$FbStoryFromJson(json);
}