generated from dellevin/template
优化代码结构,修复部分bug
This commit is contained in:
@@ -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, '已删除');
|
||||
}
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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)),
|
||||
|
||||
Reference in New Issue
Block a user