优化代码结构,修复部分bug

This commit is contained in:
DelLevin-Home
2026-07-06 02:49:46 +08:00
parent 4a7296f00f
commit 2fdcd4551d
23 changed files with 372 additions and 356 deletions

View File

@@ -1189,7 +1189,7 @@ class _MovieDetailPageState extends State<MovieDetailPage> {
onPressed: () async {
final provider = context.read<AppProvider>();
await provider.removeMovie(widget.movie.id);
if (!mounted) return;
if (!mounted || !context.mounted) return;
if (widget.embedded) {
Navigator.of(context).pop(); // close dialog
provider.selectMovie(null);
@@ -1198,7 +1198,7 @@ class _MovieDetailPageState extends State<MovieDetailPage> {
navigator.pop();
navigator.pop();
}
if (mounted) {
if (mounted && context.mounted) {
ToastUtil.show(context, '已删除');
}
},

View File

@@ -8,6 +8,7 @@ import 'package:provider/provider.dart';
import 'package:http/http.dart' as http;
import '../../providers/app_provider.dart';
import '../../widgets/fade_in_local_image.dart';
import 'package:uuid/uuid.dart';
import '../../models/data_models.dart';
import '../../utils/toast_util.dart';
import '../../utils/image_path_helper.dart';
@@ -256,6 +257,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
arguments: url,
);
if (!mounted) return;
// 处理返回的影视信息
if (result != null && result is Map<String, dynamic>) {
_fillMovieInfo(result);
@@ -353,7 +355,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
if (response.bodyBytes.length > 10 * 1024 * 1024) throw Exception('图片太大');
final fileName = 'poster_${DateTime.now().millisecondsSinceEpoch}.jpg';
final movieId = widget.movie?.id ?? DateTime.now().millisecondsSinceEpoch.toString();
final movieId = widget.movie?.id ?? const Uuid().v4();
final targetPath = await ImagePathHelper.instance.getMoviePosterPath(movieId, fileName);
await ImagePathHelper.instance.ensureDirExists(p.dirname(targetPath));
await File(targetPath).writeAsBytes(response.bodyBytes);
@@ -436,6 +438,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
initialValue: _titleController.text,
hint: '请输入影视名称',
);
if (!mounted) return;
if (result != null) setState(() => _titleController.text = result);
},
),
@@ -458,6 +461,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
initialSelected: _alternateTitles,
hint: '输入别名',
);
if (!mounted) return;
if (result != null) setState(() => _alternateTitles = result);
},
),
@@ -483,6 +487,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
initialSelected: _directors,
hint: '如:张艺谋、李安',
);
if (!mounted) return;
if (result != null) setState(() => _directors = result);
},
),
@@ -506,6 +511,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
initialSelected: _writers,
hint: '如:刘慈欣、王家卫',
);
if (!mounted) return;
if (result != null) setState(() => _writers = result);
},
),
@@ -531,6 +537,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
initialSelected: _actors,
hint: '如:梁朝伟、周星驰',
);
if (!mounted) return;
if (result != null) setState(() => _actors = result);
},
),
@@ -556,6 +563,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
initialSelected: _genres,
hint: '如:剧情、科幻、悬疑',
);
if (!mounted) return;
if (result != null) setState(() => _genres = result);
},
),
@@ -734,6 +742,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
builder: (_) => _SummaryEditorPage(initialText: _summaryController.text),
),
);
if (!mounted) return;
if (result != null) {
setState(() => _summaryController.text = result);
}
@@ -1144,7 +1153,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
final fileName = 'poster_${DateTime.now().millisecondsSinceEpoch}.jpg';
// 如果是编辑模式使用现有影视ID如果是新建模式使用临时ID保存时会替换
final movieId = widget.movie?.id ?? DateTime.now().millisecondsSinceEpoch.toString();
final movieId = widget.movie?.id ?? const Uuid().v4();
// 保存到新的路径结构: images/movies/{movieId}/{fileName}
final targetPath = await ImagePathHelper.instance.getMoviePosterPath(
@@ -1155,6 +1164,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
await File(pickedFile.path).copy(targetPath);
if (!mounted) return;
setState(() => _posterPath = targetPath);
}
} catch (e) {
@@ -1237,6 +1247,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
builder: (context, child) => child!,
);
if (!mounted) return;
if (picked != null) {
setState(() => _releaseDate = picked);
}
@@ -1252,6 +1263,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
builder: (context, child) => child!,
);
if (!mounted) return;
if (picked != null) {
setState(() => _watchDate = picked);
}
@@ -1321,7 +1333,7 @@ class _MovieFormPageState extends State<MovieFormPage> {
if (widget.movie == null) {
// 生成新的影视ID
final newMovieId = now.millisecondsSinceEpoch.toString();
final newMovieId = const Uuid().v4();
// 如果有海报需要移动到正确的ID目录
String? finalPosterPath;

View File

@@ -7,6 +7,7 @@ import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:http/http.dart' as http;
import '../../providers/app_provider.dart';
import '../../widgets/fade_in_local_image.dart';
import 'package:uuid/uuid.dart';
import '../../models/data_models.dart';
import '../../utils/toast_util.dart';
import '../../utils/image_path_helper.dart';
@@ -286,7 +287,7 @@ class _MoviePostersPageState extends State<MoviePostersPage> {
await File(pickedFile.path).copy(targetPath);
final newPoster = MoviePoster(
id: DateTime.now().millisecondsSinceEpoch.toString(),
id: const Uuid().v4(),
movieId: widget.movie.id,
posterPath: targetPath,
createdAt: DateTime.now(),
@@ -423,7 +424,7 @@ class _MoviePostersPageState extends State<MoviePostersPage> {
await File(targetPath).writeAsBytes(response.bodyBytes);
final newPoster = MoviePoster(
id: DateTime.now().millisecondsSinceEpoch.toString(),
id: const Uuid().v4(),
movieId: widget.movie.id,
posterPath: targetPath,
createdAt: DateTime.now(),

View File

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../providers/app_provider.dart';
import '../../widgets/fade_in_local_image.dart';
import 'package:uuid/uuid.dart';
import '../../models/data_models.dart';
import '../../utils/toast_util.dart';
@@ -307,7 +308,7 @@ class _MovieReviewFormPageState extends State<MovieReviewFormPage> {
if (widget.review == null) {
final newReview = MovieReview(
id: now.millisecondsSinceEpoch.toString(),
id: const Uuid().v4(),
movieId: widget.movieId,
content: _contentController.text.trim(),
reviewer: _reviewerController.text.trim(),

View File

@@ -447,8 +447,9 @@ class _MovieTabPageState extends State<MovieTabPage> {
ElevatedButton(
onPressed: () async {
await context.read<AppProvider>().removeMovie(movie.id);
if (!ctx.mounted) return;
Navigator.pop(ctx);
_loadFirst();
if (mounted) _loadFirst();
},
style: ElevatedButton.styleFrom(backgroundColor: colors.error, foregroundColor: colors.onError, elevation: 0,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),