Dart中的built_Value、BuiltList序列化错误 - 常量创建的参数必须是常量表达式。

5
我可以帮助您翻译以下的JSON对象。
{
    "notifications": [
        {
            "correspondenceId": "81",
            "type": "notification",
            "title": "Find Your Future at Indiana University",
            "snippet": "",
            "readFlag": "NO",
            "date": "Delivered on: Jul 09, 2018 at 12:00 AM",
            "readDate": "Read on: Apr 03, 2018 at 12:00 AM",
            "icon": "message",
            "color": "neutral"
        },
        {
            "correspondenceId": "80",
            "type": "notification",
            "title": "My IU Experience",
            "snippet": "",
            "readFlag": "NO",
            "date": "Delivered on: Jul 09, 2018 at 12:00 AM",
            "readDate": "Read on: Apr 03, 2018 at 12:00 AM",
            "icon": "message",
            "color": "red"
        },
        {
            "correspondenceId": "82",
            "type": "notification",
            "title": "Test RSVP",
            "snippet": "",
            "readFlag": "NO",
            "date": "Delivered on: Jul 09, 2018 at 12:00 AM",
            "readDate": "Read on: Apr 10, 2018 at 04:31 PM",
            "icon": "message",
            "color": "neutral"
        }
    ]
}

我使用built_value创建了以下对象模型。

import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

part 'notification.g.dart';

abstract class NotificationList
    implements Built<NotificationList, NotificationListBuilder> {
  BuiltList<NotificationElement> get notifications;

  NotificationList._();
  static Serializer<NotificationList> get serializer =>
      _$notificationListSerializer;
  factory NotificationList([updates(NotificationListBuilder b)]) =
      _$NotificationList;
}

abstract class NotificationElement
    implements Built<NotificationElement, NotificationElementBuilder> {
  String get correspondenceId;

  String get type;

  String get title;

  @nullable
  String get snippet;

  String get readFlag;

  bool get derivedReadFlag {
    return readFlag.contains("YES");
  }

  String get date;

  @nullable
  String get readDate;

  String get icon;

  String get color;

  NotificationElement._();
  static Serializer<NotificationElement> get serializer =>
      _$notificationElementSerializer;
  factory NotificationElement([updates(NotificationElementBuilder b)]) =
      _$NotificationElement;
}

以下是用于 JSON 反序列化的序列化器:

import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'package:sunapsis/datasource/dataobjects/login.dart';
import 'package:sunapsis/datasource/dataobjects/notification.dart';

part 'serializers.g.dart';

@SerializersFor([
  Login,
  NotificationList,
])
final Serializers serializers =
    (_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();

登录对象模型工作正常,符合预期,但是当我将NotificationList添加到SerializersFor中时,serializer.g.dart会开始出现错误。在serializers.g.dart文件中,对于BuiltList,我收到以下错误消息:

常量创建的参数必须是常量表达式

无效的常量值

未定义名称“BuiltList”

未定义类“ListBuilder”

在尝试编译时,我收到了相同的错误信息。
compiler message: lib/datasource/dataobjects/serializers.g.dart:24:15: Error: Getter not found: 'BuiltList'.
compiler message:               BuiltList, const [const FullType(NotificationElement)]),
compiler message:               ^
compiler message: lib/datasource/dataobjects/serializers.g.dart:25:21: Error: Method not found: 'ListBuilder'.
compiler message:           () => new ListBuilder<NotificationElement>()))
compiler message:                     ^^^^^^^^^^^

我不确定我的问题在哪里或者可能出现了什么问题。使用以下版本的built_value和built_collection:

built_value: "^5.5.3"
built_collection: "^3.1.1"
build_runner: ^0.8.0
built_value_generator: ^5.5.0

这是生成的 serializer.g.dart 文件:
// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'serializers.dart';

// **************************************************************************
// BuiltValueGenerator
// **************************************************************************

// ignore_for_file: always_put_control_body_on_new_line
// ignore_for_file: annotate_overrides
// ignore_for_file: avoid_annotating_with_dynamic
// ignore_for_file: avoid_returning_this
// ignore_for_file: omit_local_variable_types
// ignore_for_file: prefer_expression_function_bodies
// ignore_for_file: sort_constructors_first

Serializers _$serializers = (new Serializers().toBuilder()
      ..add(AuthProcess.serializer)
      ..add(Login.serializer)
      ..add(NotificationElement.serializer)
      ..add(NotificationList.serializer)
      ..addBuilderFactory(
          const FullType(
              BuiltList, const [const FullType(NotificationElement)]),
          () => new ListBuilder<NotificationElement>()))
    .build();

任何帮助将不胜感激。
2个回答

15

看起来 serializers.g.dart 缺少了一个导入 built_collection 的语句,这是您可以找到那些类型定义的地方。在 serializers.dart 中添加一个导入语句(而不是生成的部分文件),然后查看是否解决了问题。


1
非常感谢,我添加了导入并解决了问题。 PS:当我再次观看无聊的Flutter开发节目时,看到了您的回复。非常感谢您的帮助。 - ssiddh

6

如果那个方法不起作用!导入

import 'package:built_collection/built_collection.dart';

在你的 serializers.dart 文件中,它将会反映在 serializers.g.dart 中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接