结构重构

This commit is contained in:
DelLevin-Home
2026-03-12 14:33:28 +08:00
parent f63b5b1843
commit 0f221456cb
39 changed files with 106 additions and 105 deletions

View File

@@ -0,0 +1,108 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../providers/app_provider.dart';
import '../../widgets/movie_status_bar.dart';
import '../../widgets/movie_list_item.dart';
/// 观影标签页 - 极简主义设计
class MovieTabPage extends StatelessWidget {
const MovieTabPage({super.key});
@override
Widget build(BuildContext context) {
return Column(
children: [
// 状态选择栏
const MovieStatusBar(),
const Divider(height: 0.5, thickness: 0.5, color: Color(0xFFE5E5E5)),
// 影片列表
Expanded(
child: _buildMovieList(context),
),
],
);
}
/// 构建影片列表
Widget _buildMovieList(BuildContext context) {
return Consumer<AppProvider>(
builder: (context, provider, child) {
final statusMap = {
0: 'watched',
1: 'watching',
2: 'want_to_watch',
};
final currentStatus = statusMap[provider.movieStatusIndex]!;
final movies = provider.getMoviesByStatus(currentStatus);
if (movies.isEmpty) {
return _buildEmptyState(context, provider.movieStatusIndex);
}
return RefreshIndicator(
onRefresh: () async => await provider.loadMovies(),
color: const Color(0xFF1A1A1A),
backgroundColor: Colors.white,
child: GridView.builder(
padding: const EdgeInsets.all(16),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
childAspectRatio: 0.55,
crossAxisSpacing: 12,
mainAxisSpacing: 16,
),
itemCount: movies.length,
itemBuilder: (context, index) {
return MovieListItem(movie: movies[index]);
},
),
);
},
);
}
/// 构建空状态
Widget _buildEmptyState(BuildContext context, int statusIndex) {
final statusText = ['已看', '在看', '想看'][statusIndex];
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(
Icons.movie_outlined,
size: 48,
color: Color(0xFFCCCCCC),
),
const SizedBox(height: 16),
Text(
'暂无$statusText的影片',
style: const TextStyle(
fontSize: 15,
color: Color(0xFF999999),
),
),
const SizedBox(height: 24),
TextButton(
onPressed: () {
final statusMap = {
0: 'watched',
1: 'watching',
2: 'want_to_watch',
};
final currentStatus = statusMap[statusIndex]!;
Navigator.pushNamed(
context,
'/movie-form',
arguments: {'initialStatus': currentStatus},
);
},
child: const Text('添加记录'),
),
],
),
);
}
}