flutterblocbuilt-value

How to build a list using built-value


I have this problem:

I have an array :

[
  {
    "name": "John",
  },
  {
    "name": "Antonio",
  },
  {
    "name": "Simon",
  }
]

I use built_value, as follows I'm trying to deserialize a json string:

library name;

import 'dart:convert';

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

part 'name.g.dart';

abstract class Name implements Built<Name, NameBuilder> {

  String get name;

  Name._();

  factory Name([updates(NameBuilder b)]) = _$Name;

  String toJson() {
    return json.encode(serializers.serializeWith(Name.serializer, this));
  }

  static Name fromJson(String jsonString) {
    return serializers.deserializeWith(
        Name.serializer, json.decode(jsonString));
  }

  static Serializer<Name> get serializer => _$nameSerializer;
}

As I understand it, I will get the name, but how do I get The NameResult list from this?

Now I tried to do it this way:

library name_result;

import 'dart:convert';

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

part 'name_result.g.dart';

abstract class NameResult implements Built<NameResult, NameResultBuilder> {

  BuiltList<Name> get nameResult;

  NameResult._();

  factory NameResult([updates(NameResultBuilder b)]) = _$NameResult;

  String toJson() {
    return json.encode(serializers.serializeWith(NameResult.serializer, this));
  }

  static NameResult fromJson(String jsonString) {
    return serializers.deserializeWith(
        NameResult.serializer, json.decode(jsonString));
  }

  static Serializer<NameResult> get serializer => _$nameResultSerializer;
}

But I get the following error : failed due to: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String' in type cast occurred in Instance of 'NameBloc'.

How can I solve this?


Solution

  • serializers.dart:

    const builtListString = FullType(
      BuiltList,
      [FullType(String)],
    );
    
    ...
    final standardSerializers = (serializers.toBuilder()
          ..addBuilderFactory(
            builtListString,
            () => ListBuilder<String>(),
          )
          ..add(Iso8601DateTimeSerializer())
          ..addPlugin(StandardJsonPlugin()))
        .build();
    
        final json = jsonDecode('[{ ... }]');
        final names = standardSerializers.deserialize(
          json,
          specifiedType: builtListString,
        ) as BuiltList<String>;