如何在 Flutter Dart 冻结模型中使用 Late Final 关键字?

问题描述 投票:0回答:2

如何在 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
注释,所以我想应该有一种方法可以实现这项工作。上课还是冻结,只是懒惰

flutter dart immutability freezed
2个回答
0
投票

错误非常明显,你不能有一个带有

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;

0
投票

只需删除

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.