generated from dellevin/template
代码优化
This commit is contained in:
@@ -13,6 +13,16 @@ DateTime? _safeParseDate(String? str, {DateTime? fallback}) {
|
||||
return DateTime.tryParse(str)?.toLocal() ?? fallback;
|
||||
}
|
||||
|
||||
/// 安全将动态值转为 double,失败时返回 fallback
|
||||
double? _safeParseDouble(dynamic value, {double? fallback}) {
|
||||
if (value == null) return fallback;
|
||||
if (value is double) return value;
|
||||
if (value is int) return value.toDouble();
|
||||
if (value is num) return value.toDouble();
|
||||
if (value is String) return double.tryParse(value) ?? fallback;
|
||||
return fallback;
|
||||
}
|
||||
|
||||
/// 解析字符串列表(通用工具函数,不限于 Movie)
|
||||
List<String> parseStringListGeneric(dynamic data) {
|
||||
if (data == null) return [];
|
||||
@@ -86,14 +96,14 @@ class Movie {
|
||||
genres: _parseStringList(json['genres']),
|
||||
alternateTitles: _parseStringList(json['alternate_titles']),
|
||||
summary: json['summary'],
|
||||
rating: json['rating']?.toDouble(),
|
||||
rating: _safeParseDouble(json['rating']),
|
||||
status: json['status'] ?? 'want_to_watch',
|
||||
category: json['category'] ?? 'movie',
|
||||
watchDate: _safeParseDate(json['watch_date']),
|
||||
createdAt: _safeParseDate(json['created_at'], fallback: DateTime.now())!,
|
||||
updatedAt: _safeParseDate(json['updated_at'], fallback: DateTime.now())!,
|
||||
isDeleted: json['is_deleted'] == 1 || json['is_deleted'] == true,
|
||||
coverOffset: (json['cover_offset'] ?? 0.0).toDouble(),
|
||||
coverOffset: _safeParseDouble(json['cover_offset'], fallback: 0.0)!,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -224,14 +234,14 @@ class Book {
|
||||
publisher: json['publisher'],
|
||||
genres: Movie.parseStringList(json['genres']),
|
||||
summary: json['summary'],
|
||||
rating: json['rating']?.toDouble(),
|
||||
rating: _safeParseDouble(json['rating']),
|
||||
status: json['status'] ?? 'want_to_read',
|
||||
isbn: json['isbn'],
|
||||
publishDate: _safeParseDate(json['publish_date']),
|
||||
createdAt: _safeParseDate(json['created_at'], fallback: DateTime.now())!,
|
||||
updatedAt: _safeParseDate(json['updated_at'], fallback: DateTime.now())!,
|
||||
isDeleted: json['is_deleted'] == 1 || json['is_deleted'] == true,
|
||||
coverOffset: (json['cover_offset'] ?? 0.0).toDouble(),
|
||||
coverOffset: _safeParseDouble(json['cover_offset'], fallback: 0.0)!,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -67,7 +67,6 @@ class _ProfilePageState extends State<ProfilePage> with RouteAware {
|
||||
|
||||
Future<void> _loadUserData() async {
|
||||
try {
|
||||
await UserPrefs.init();
|
||||
setState(() {
|
||||
_nickname = _userPrefs.nickname;
|
||||
_motto = _userPrefs.motto;
|
||||
|
||||
@@ -194,6 +194,7 @@ class AppProvider extends ChangeNotifier {
|
||||
void setThemeMode(ThemeMode mode) {
|
||||
if (_themeMode != mode) {
|
||||
_themeMode = mode;
|
||||
UserPrefs().setThemeMode(mode.index); // 0=system, 1=light, 2=dark
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ class DatabaseHelper {
|
||||
static final DatabaseHelper instance = DatabaseHelper._init();
|
||||
static Database? _database;
|
||||
static Completer<void>? _reopenCompleter;
|
||||
static Completer<Database>? _initCompleter;
|
||||
|
||||
DatabaseHelper._init();
|
||||
|
||||
@@ -41,13 +42,28 @@ class DatabaseHelper {
|
||||
}
|
||||
|
||||
Future<Database> get database async {
|
||||
// 如果正在重开,等待完成(无忙等待)
|
||||
// 如果正在重开,等待完成
|
||||
if (_reopenCompleter != null) {
|
||||
await _reopenCompleter!.future;
|
||||
}
|
||||
if (_database != null) return _database!;
|
||||
_database = await _initDB('mooknote.db');
|
||||
return _database!;
|
||||
|
||||
// 如果已有初始化在进行,等待它完成
|
||||
if (_initCompleter != null) {
|
||||
return _initCompleter!.future;
|
||||
}
|
||||
|
||||
_initCompleter = Completer<Database>();
|
||||
try {
|
||||
_database = await _initDB('mooknote.db');
|
||||
_initCompleter!.complete(_database!);
|
||||
return _database!;
|
||||
} catch (e) {
|
||||
_initCompleter!.completeError(e);
|
||||
rethrow;
|
||||
} finally {
|
||||
_initCompleter = null;
|
||||
}
|
||||
}
|
||||
|
||||
Future<Database> _initDB(String filePath) async {
|
||||
|
||||
Reference in New Issue
Block a user