smartstruct 1.1.2+1 smartstruct: ^1.1.2+1 copied to clipboard
smartstruct - A dart bean mapper annotation processor - the easy nullsafe way!
Simple Mapping #
class Dog {
final String breed;
final int age;
final String name;
Dog(this.breed, this.age, this.name);
}
class DogModel {
final String breed;
final int age;
final String name;
DogModel(this.breed, this.age, this.name);
}
To generate a mapper for these two beans, you need to create a mapper interface.
import 'package:smartstruct/smartstruct.dart';
// dog.mapper.dart
part 'dog.mapper.g.dart';
@mapper
abstract class DogMapper {
Dog fromModel(DogModel model);
}
Explicit Field Mapping #
If some fields do not match each other, you can add a Mapping Annotation on the method level, to change the behaviour of certain mappings.
class Dog {
final String name;
Dog(this.name);
}
class DogModel {
final String dogName;
DogModel(this.dogName);
}
// dog.mapper.dart
import 'package:smartstruct/smartstruct.dart';
part 'dog.mapper.g.dart';
@Mapper()
class DogMapper {
@Mapping(source: 'dogName', target: 'name')
Dog fromModel(DogModel model);
}
In this case, the field dogName of DogModel will be mapped to the field name of the resulting Dog
// dog.mapper.g.dart
class DogMapperImpl extends DogMapper {
@override
Dog fromModel(DogModel model) {
Dog dog = Dog(model.dogName);
return dog;
}
}
Nested Bean Mapping #
Nested beans can be mapped, by defining an additional mapper method for the nested bean.
class NestedTarget {
final SubNestedTarget subNested;
NestedTarget(this.subNested);
}
class SubNestedTarget {
final String myProperty;
SubNestedTarget(this.myProperty);
}
class NestedSource {
final SubNestedSource subNested;
NestedSource(this.subNested);
}
class SubNestedSource {
final String myProperty;
SubNestedSource(this.myProperty);
}
// nested.mapper.dart
import 'package:smartstruct/smartstruct.dart';
part 'nested.mapper.g.dart';
@Mapper()
abstract class NestedMapper {
NestedTarget fromModel(NestedSource model);
SubNestedTarget fromSubClassModel(SubNestedSource model);
}
Will generate the mapper
// nested.mapper.g.dart
class NestedMapperImpl extends NestedMapper {
@override
NestedTarget fromModel(NestedSource model) {
final nestedtarget = NestedTarget(fromSubClassModel(model.subNested));
return nestedtarget;
}
@override
SubNestedTarget fromSubClassModel(SubNestedSource model) {
final subnestedtarget = SubNestedTarget(model.myProperty);
return subnestedtarget;
}
}
Injectable #
The Mapper can be made a lazy injectable singleton, by setting the argument useInjection to true, in the Mapper Interface. In this case you also need to add the injectable dependency, as described here. https://pub.dev/packages/injectable
// dog.mapper.dart
import 'package:smartstruct/smartstruct.dart';
part 'dog.mapper.g.dart';
@Mapper(useInjectable = true)
abstract class DogMapper {
Dog fromModel(DogModel model);
}
// dog.mapper.g.dart
@LazySingleton(as: DogMapper)
class DogMapperImpl extends DogMapper {...}