[英]Inheritance in Null Safety - Flutter
我正在研究 Flutter 清潔架構。 最初我開發我的項目時沒有健全的空安全。 我最近將它遷移到 null-safety。
遷移到 null-safety 非常順利,但不幸的是,我無法解決繼承類的問題。
這是我正在使用的代碼示例:
實體:
用戶實體:
class UserEntity extends Equatable {
final int userID;
final String email;
const UserEntity({required this.userID, required this.email});
@override
List<Object> get props => [userID, email];
}
課程實體:
class CourseEntity extends Equatable {
final int courseID;
final String courseName;
const CourseEntity({required this.courseID, required this.courseName});
@override
List<Object> get props => [courseID, courseName];
}
數據實體:
class DataEntity extends Equatable {
final UserEntity? user;
final CourseEntity? course;
const DataEntity({required this.user, required this.course});
@override
List<Object> get props => [user, course];
}
楷模:
用戶模型:
class UserModel extends UserEntity {
const UserModel({
required int userID,
required String email,
}) : super(userID: userID, email: email);
factory UserModel.fromJson(Map<dynamic, dynamic> json) {
return UserModel(
userID: json["userID"],
email: json["email"],
);
}
Map<String, dynamic> toJson() {
return {
"userID": userID,
"email": email,
};
}
}
課程模型:
class CourseModel extends CourseEntity {
const CourseModel({
required int courseID,
required String courseName,
}) : super(courseID: courseID, courseName: courseName);
factory CourseModel.fromJson(Map<dynamic, dynamic> json) {
return CourseModel(
courseID: json["courseID"],
courseName: json["courseName"],
);
}
Map<String, dynamic> toJson() {
return {
"courseID": courseID,
"courseName": courseName,
};
}
}
數據模型:
class DataModel extends DataEntity {
const DataModel({
required UserModel? user,
required CourseModel? course,
}) : super(user: user, course: course);
factory DataModel.fromJson(Map<dynamic, dynamic> json) {
return DataModel(
user: UserModel.fromJson(json["user"]),
course: CourseModel.fromJson(json["course"]),
);
}
}
本地數據源:
本地保存數據:
abstract class LocalDataSource {
Future<void> saveData(DataModel model);
Future<void> saveUser(UserModel user);
Future<void> saveCourse(CourseModel course);
}
class LocalDataSourceImpl implements LocalDataSource {
@override
Future<void> saveData(DataModel model) async {
await saveUser(model.user);
await saveCourse(model.course);
}
@override
Future<void> saveUser(UserModel model) async {
final box = await Hive.openBox("USER");
return box.put("user", model.toJson());
}
@override
Future<void> saveCourse(CourseModel model) async {
final box = await Hive.openBox("COURSE");
return box.put("course", model.toJson());
}
}
解釋:
我希望所有示例類都易於理解。 有 2 個實體用戶和課程。 數據實體是這兩個實體的組合。 模型正在擴展這些實體,這意味着實體是它們各自模型的父類。
class LocalDataSource 用於在設備本地存儲數據。 我正在使用 Hive 來緩存數據。 有兩個主要的未來,即 saveUser 和 saveCourse。 saveData 未來是這兩個未來的組合,就像實體一樣。
問題:
問題存在於 class LocalDataSourceImpl 的 future saveData 中。 未來需要 1 個參數,即 DataModel。 其他期貨也需要 1 個參數,即 UserModel 和 CourseModel。
在saveData(model)
未來,當我將 arguments 的值分別提供給saveUser
和saveCourse
作為saveUser(model.user)
和saveCourse(model.course)
時,這是我在 arguments 通過時收到的錯誤:
無法將參數類型“UserEntity”分配給參數類型“UserModel”.dart(argument_type_not_assignable)
解決方法:
第一個解決方法是使用 getter:
class DataModel extends DataEntity {
final UserModel? _user;
final CourseModel? _course;
const DataModel({
required UserModel user,
required CourseModel course,
}) : _user = user,
_course = course, super(
user: user,
course: course,
);
UserModel? get user => _user;
CourseModel? get course => _course;
...
}
第二種解決方法可能是覆蓋字段:
class DataModel extends DataEntity {
final UserModel? user;
final CourseModel? course;
const DataModel({
required this.user,
required this.course,
}) : super(
user: user,
course: course,
);
...
}
我很困惑這兩個中的任何一個是否是一個好的做法,因為必須沒有分配錯誤,因為模型實際上是實體的子類。
提前致謝!
最簡單和最簡單的方法是添加類型轉換,而且效果很好!
class LocalDataSourceImpl implements LocalDataSource {
@override
Future<void> saveData(DataModel model) async {
await saveUser(model.user as UserModel);
await saveCourse(model.course as CourseModel);
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.