【发布时间】:2019-09-04 09:51:16
【问题描述】:
我正在使用 Flutter 构建我的第一个应用程序,该应用程序使用 sqlite database。所以我有模型和存储库。
代码布局:
我有 2 个模型(在完成的应用程序中会有更多)UserModel、TimesheetModel,它们都扩展了 BaseModel
我有 2 个存储库(在完成的应用程序中会有更多)UserRepository、TimesheetRepository,它们都扩展了 BaseRepository
我正在尝试做的事情:
我希望在BaseRepository 中有可重用的代码,例如:getAll()、countAll() 等,这样扩展基本存储库的所有存储库都具有此功能,我需要做的就是设置表名和设置返回的Model。
错误:
正如您从我的代码中看到的那样,因为BaseRepository 正在返回BaseModel 类型,所以当我在时间表对象上调用all() 函数时,我收到以下错误:类型“列表”不是“列表”类型的子类型'
我不知道如何解决这个问题,请问有什么建议吗?
基础存储库
abstract class BaseRepository {
final String table;
final model;
BaseRepository({this.table, this.model});
// Retrieve all the items
Future<List<BaseModel>> all() async {
final sql = '''SELECT * FROM $table''';
final data = await db.rawQuery(sql);
List<BaseModel> forms = List();
for (final node in data) {
final form = model.fromJson(jsonData: node);
forms.add(form);
}
return forms;
}
// Find an item by its ID
Future findById(int id) async {
final sql = '''SELECT * FROM $table
WHERE id = ?''';
List<dynamic> params = [id];
final data = await db.rawQuery(sql, params);
final form = model.fromJson(jsonData: data.first);
return form;
}
// Count all the items
Future<int> count() async {
final data = await db.rawQuery('''SELECT COUNT(*) FROM $table''');
int count = data[0].values.elementAt(0);
int idForNewItem = count++;
return idForNewItem;
}
// clear the table
Future<void> delete() async {
// truncate current database table
await db.rawQuery('''DELETE FROM $table''');
}
}
时间表存储库
class TimesheetRepository extends BaseRepository {
String table = 'timesheets';
TimesheetModel model = new TimesheetModel();
// Search for a item by its name
Future<List<TimesheetModel>> findByDate(DateTime dateTime) async {
final String date = DateFormat("yyyy-MM-dd").format(dateTime);
final sql = '''SELECT * FROM $table WHERE timesheet_date = ?''';
List<dynamic> params = [date];
final data = await db.rawQuery(sql, params);
List<TimesheetModel> forms = List();
for (final node in data) {
final form = TimesheetModel.fromJson(jsonData: node);
forms.add(form);
}
return forms;
}
// Add a new item
Future<void> store(TimesheetModel timesheet) async {
final sql = '''INSERT INTO $table
(
user_id,
timesheet_date,
start_time,
end_time,
json,
is_uploaded
)
VALUES (?,?,?,?,?,?)''';
List<dynamic> params = [
timesheet.userId,
DateFormat("yyyy-MM-dd").format(timesheet.timesheetDate),
timesheet.startTime,
timesheet.endTime,
convert.json.encode(timesheet.json),
timesheet.is_uploaded,
];
final result = await db.rawInsert(sql, params);
DatabaseCreator.databaseLog('Add form', sql, null, result, params);
}
}
在 Timesheet 上调用 all 时
TimesheetRepository timesheet = TimesheetRepository();
timesheet.all();
基础模型
abstract class BaseModel {
fromJson();
}
时间表模型
class TimesheetModel extends BaseModel {
int id;
int userId;
DateTime timesheetDate;
String startTime;
String endTime;
Map json = {
"task": "",
"detail": "",
"notes": "",
};
bool is_uploaded;
TimesheetModel({
this.id,
this.userId,
this.timesheetDate,
this.startTime,
this.endTime,
this.json,
this.is_uploaded,
});
fromJson({Map<String, dynamic> jsonData}) {
return TimesheetModel(
id: jsonData['id'] as int,
userId: jsonData['user_id'] as int,
timesheetDate: timesheetDate,
startTime: jsonData['start_time'],
endTime: jsonData['end_time'],
is_uploaded: hasUploaded,
);
}
}
【问题讨论】:
-
请出示BaseModel和TimeSheetModel的代码
-
嘿@RodrigoBastos 谢谢你的回复,我现在已经添加了你要求的代码
-
我多次遇到同样的问题,但没有找到解决方案。我不知道在 Dart 中有什么好的方法。
-
我希望有人可以发布答案或至少是一个好的解决方法
-
我也有这个问题。有人吗?
标签: class inheritance flutter dart