Null安全中的继承-Flutter



我正在研究Flutter Clean Architecture。最初,我在没有健全的零安全性的情况下开发了我的项目。我最近将其迁移到零安全。

迁移到null安全性非常顺利,但不幸的是,我无法解决继承类的问题。

以下是我正在使用的代码示例:

实体:

用户实体:

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());
} 
}

解释:

我希望所有的示例类都易于理解。有两个实体User和Course。数据实体是这两个实体的组合。模型正在扩展这些实体,这意味着这些实体是它们各自模型的父类。

类LocalDataSource用于在设备上本地存储数据。我正在使用Hive缓存数据。有两个主要的未来,即saveUser和saveCourse。saveData future是这两个future的组合,就像实体一样。

问题:

类LocalDataSourceImpl的未来saveData中存在此问题。未来需要1个参数,即DataModel。其他期货也需要一个参数,即UserModel和CourseModel。

saveData(model)未来,当我将saveUsersaveCourse的各个自变量的值作为saveUser(model.user)saveCourse(model.course)提供时,这是我在传递的自变量上收到的错误:

参数类型"UserEntity"无法分配给参数类型"UserModel"。dart(argument_type_not_assignable(

解决方法:

第一个解决方法可能是使用getters:

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,
);
...
}

我很困惑这2个中的任何一个是否是一个好的实践,因为模型实际上是实体的子类,所以不能有赋值错误。

提前感谢!

最简单、最简单的方法是添加类型转换,效果非常好!

class LocalDataSourceImpl implements LocalDataSource {
@override
Future<void> saveData(DataModel model) async {
await saveUser(model.user as UserModel);
await saveCourse(model.course as CourseModel);
}
...

最新更新