69 lines
1.7 KiB
Dart
69 lines
1.7 KiB
Dart
import 'package:json_annotation/json_annotation.dart';
|
||
|
||
import '../../domain/entities/user.dart';
|
||
|
||
part 'user_dto.g.dart';
|
||
|
||
/// 用户 DTO(Data Transfer Object)
|
||
///
|
||
/// local / remote 共用的数据传输对象,放在 data/models/。
|
||
/// 提供与 Domain Entity [User] 之间的双向转换。
|
||
///
|
||
/// ## 数据流位置(本地存储场景)
|
||
///
|
||
/// ```
|
||
/// 写入本地:
|
||
/// LoginData.toEntity() → User
|
||
/// → UserDto.fromEntity(user) → ★ UserDto ★ ← 你在这里
|
||
/// → toJson() → SQLite / SharedPreferences
|
||
///
|
||
/// 读取本地:
|
||
/// SQLite / SharedPreferences → JSON
|
||
/// → ★ UserDto.fromJson() ★ ← 你在这里
|
||
/// → UserDto.toEntity() → User
|
||
/// → ViewModel.state → View
|
||
/// ```
|
||
///
|
||
/// 注意:登录接口的 Response DTO 是 [LoginData](含 token),
|
||
/// 本类用于纯用户信息的本地持久化,不含 token。
|
||
@JsonSerializable()
|
||
class UserDto {
|
||
@JsonKey(name: 'user_id')
|
||
final String userId;
|
||
final String email;
|
||
final String? nickname;
|
||
final String? avatar;
|
||
|
||
const UserDto({
|
||
required this.userId,
|
||
required this.email,
|
||
this.nickname,
|
||
this.avatar,
|
||
});
|
||
|
||
factory UserDto.fromJson(Map<String, dynamic> json) =>
|
||
_$UserDtoFromJson(json);
|
||
|
||
Map<String, dynamic> toJson() => _$UserDtoToJson(this);
|
||
|
||
/// DTO → Domain Entity
|
||
User toEntity() {
|
||
return User(
|
||
id: userId,
|
||
email: email,
|
||
nickname: nickname,
|
||
avatar: avatar,
|
||
);
|
||
}
|
||
|
||
/// Domain Entity → DTO
|
||
factory UserDto.fromEntity(User user) {
|
||
return UserDto(
|
||
userId: user.id,
|
||
email: user.email,
|
||
nickname: user.nickname,
|
||
avatar: user.avatar,
|
||
);
|
||
}
|
||
}
|