簡體   English   中英

Inheritance 在 Null 安全 - Flutter

[英]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 的值分別提供給saveUsersaveCourse作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM