The library provides the Exportable class - a mixin providing an ability to export objects to Maps or JSON. Useful for data models: storing in databases as Maps, or passing between client/server as JSON.
Properties of a class that is mixed with Exportable and wanted to be exportable should be annotated with @export, and could be
- any type supported by JSON (see JsonEncoder.convert())
- any calss that mixes
Exportable DateTime
Usage example:
class Foo extends Object with Exportable { @export String bar; } void main() { Foo foo = new Exportable(Foo); // The same as // Foo foo = new Foo(); foo.bar = 'Bar'; print(foo.toMap()); // => {bar: Bar} print(foo.toJson()); // => {"bar":"Bar"} print(foo.toString()); // => {"bar":"Bar"} Foo baz = new Exportable(Foo, '{"bar":"Baz"}'); // The same as // Foo baz = new Foo(); // baz.initFromJson('{"bar":"Baz"}'); print(baz); // => {"bar":"Baz"} Foo baz2 = new Exportable(Foo, {'bar': 'Baz'}); // The same as // Foo baz2 = new Foo(); // baz2.initFromMap({'bar': 'Baz'}); print(baz2); // => {"bar":"Baz"} } Metadata annotations are used to
- let the Exportable class know which properties could be exported or imported,
- allow tree-shaking of a code.
When running in JS context, there are some difficulties with type detecting. So, here are some annotation rules.
If you plan to use exportable models with Dart VM only:
- Each exportable property of an exportable class should be annotated with
@export. - If you need a tree-shaking: annotate an exportable class itself. But this is not mandatory.
If you plan to use exportable models with dart2js:
- Each exportable property of a JSON supported class should be annotated with
@export. - Properties of a non JSON supported class (see JsonEncoder.convert()) should be annotated with
@Export(<type>), where<type>is a type of a property. - Exportable class itself should be annotated with
@export.
- Provide more information/examples in the README.
- Check why dart2js says "Hint: X methods retained for use by dart:mirrors out of X total methods (X%)" (seems like we have 1 retained method for one exportable class... is this a constructor?)
- Write tests!