Что такое равный библиотека доступна в флаттер дротик, как Гсон в Java - PullRequest
0 голосов
/ 04 января 2019

Есть ли библиотека для сохранения объекта и его восстановления.
В Android Java мы используем Gson, чтобы сделать это, но во флаттере нет Gson

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Библиотека типа GSON не будет возможна во Flutter, , поскольку Flutter не поддерживает отражение кода. Отражение мешает тряске деревьев , трепетание которых необходимо для очистки неиспользуемого кода и создания компактного приложения.

подробнее о теме и альтернативах здесь

Вы можете использовать этот сайт для преобразования ваших JSON в класс, и он автоматически подготавливает методы toJson fromJson.

0 голосов
/ 04 января 2019

Для этого у вас есть пакет built_value .

С его помощью вы можете сериализовать и десериализовать объекты.

Сначала вам необходимо объявить объект:

part 'foo.g.dart'; 

abstract class Foo
    implements Built<Foo, FooBuilder>{
  static Serializer<Foo> get serializer => _$fooSerializer;

  String get fooValue;

  @nullable int get creationDate;

  Foo._();

  factory Foo([updates(FooBuilder b)]) = _$Foo;
}

Все объекты должны будут следовать этой модели фрейма: - Быть абстрактным классом, реализующим Built - Объявление значения static Serializer getter - Объявление _() - Объявление factory -Объявление .part вверху, чтобы мы могли сгенерировать файл модели

Я рекомендую вам скопировать класс и изменить только имена и модель.

Затем, если вы хотитечтобы его сериализовать, вам нужно создать Serializer класс

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

part 'serializers.g.dart';

@SerializersFor(const [
  Foo // declare here all the classes to be serialized
])

Serializers serializers = _$serializers;

Serializers standardSerializers =
(serializers.toBuilder()
  ..add(CustomDateTimeSerializer()) // delcare here custom plugins
  ..addPlugin(StandardJsonPlugin())
  ).build();

}

В качестве бонуса я опубликую здесь специальный сериализатор для значений времени:

/// Serializer for [DateTime] using Milliseconds instead of MicroSeconds
///
/// An exception will be thrown on attempt to serialize local DateTime
/// instances; you must use UTC.
class CustomDateTimeSerializer implements PrimitiveSerializer<DateTime> {
  final bool structured = false;
  @override
  final Iterable<Type> types = new BuiltList<Type>([DateTime]);
  @override
  final String wireName = 'DateTime';

  @override
  Object serialize(Serializers serializers, DateTime dateTime,
      {FullType specifiedType = FullType.unspecified}) {
    if (!dateTime.isUtc) {
      throw new ArgumentError.value(
          dateTime, 'dateTime', 'Must be in utc for serialization.');
    }

    return dateTime.microsecondsSinceEpoch / 1000;
  }

  @override
  DateTime deserialize(Serializers serializers, Object serialized,
      {FullType specifiedType = FullType.unspecified}) {
    final microsecondsSinceEpoch = serialized as int;
    return new DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch * 1000 * 1000,
        isUtc: true);
  }
}

После этогообязательно запустите следующее в терминале, в корне папки вашего проекта:

flutter packages pub run build_runner watch

Журнал поможет вам найти ошибки, которые есть в вашем коде.

Тогда вы будетеесть файлы .g для каждой модели.

Теперь вы можете сериизмените объект с помощью:

import 'dart:convert' as json;

//...
var jsonEncoded = json.jsonEncode(standardSerializers.serializeWith(Foo.serializer, foo));

Бонусный совет: это также может быть использовано для построения вашего объекта:

var foo = Foo((b) => b
   ..fooValue = "foo"
   ..creationDate = DateTime.now()
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...