是否有可用于保存对象并恢复它的库。 在android java中我们使用Gson来做这个但是在颤动中没有Gson
发布于 2019-06-11 13:57:47
你有这个build_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;
}
所有对象都必须遵循这个框架模型: - 作为一个抽象类implmenting Built
- 声明一个static
Serializer
getter值 - 声明_()
- 声明a 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
The log will help you find errors that you have in your code.
Then, you will have the .g
files for each model.
You can now serialize the object with:
import 'dart:convert' as json;
//...
var jsonEncoded = json.jsonEncode(standardSerializers.serializeWith(Foo.serializer, foo));
Bonus tip: this can also be used to have a builder for your object:
var foo = Foo((b) => b
..fooValue = "foo"
..creationDate = DateTime.now()
);
发布于 2019-06-11 15:04:33
因为Flutter不支持代码反射,所以在Flutter中不可能使用像GSON这样的库。反射干扰树摇动,颤振需要清理未使用的代码并提供一个紧凑的应用程序。
您可以使用此站点将JSON转换为类,并自动从json方法准备toJson。
https://stackoverflow.com/questions/-100009090
复制相似问题