Freezed Support
Map to and from freezed immutable classes.
Freezed Support
dart_mapper generates correct mapping code for freezed classes. No special annotations are needed on the mapper — just declare your methods as usual.
1. Add Dependencies
# pubspec.yaml
dependencies:
freezed_annotation: ^3.0.0
dart_mapper: ^1.0.0
dev_dependencies:
freezed: ^3.0.0
dart_mapper_generator: ^1.0.0
build_runner: ^2.4.0
2. Configure Build Order
Add a build.yaml at the root of your package so freezed generates its code before dart_mapper_generator analyzes it:
# build.yaml
global_options:
freezed:
runs_before:
- dart_mapper_generator
Without this, dart_mapper_generator may see incomplete freezed types and fail.
3. Define Your Models
import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.freezed.dart';
@freezed
abstract class User with _$User {
const User._();
const factory User({
required String id,
String? username,
}) = _User;
}
4. Define the Mapper
import 'package:dart_mapper/dart_mapper.dart';
import 'user.dart';
import 'user_dto.dart';
part 'user_mapper.g.dart';
@Mapper()
abstract class UserMapper {
UserDto toDto(User user);
User fromDto(UserDto dto);
}
The generator detects that User is a freezed class and uses its factory constructor in the generated output.
Generated Code
@override
UserDto toDto(User user) {
return UserDto(
id: user.id,
username: user.username,
);
}
@override
User fromDto(UserDto dto) {
return User(
id: dto.id,
username: dto.username,
);
}
Field Renaming and Ignores
All @Mapping annotations work normally with freezed targets:
@Mapper()
abstract class UserMapper {
@Mapping(target: 'displayName', source: 'username')
@Mapping(target: 'internalToken', ignore: true)
UserView toView(User user);
}
Enum Fields in Freezed Classes
Freezed classes may contain enum fields defined with the @freezed annotation. These resolve automatically. Use @ValueMapping on the mapper method if the source and target enums have different constant names.
Run the Generator
dart run build_runner build
# or keep it running during development:
dart run build_runner watch