This commit is contained in:
root
2026-10-16 13:51:00 +08:00
parent 6bf949949c
commit 8fc899d0a9
3830 changed files with 11228 additions and 188377 deletions
+31 -25
View File
@@ -1,21 +1,44 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/theme/app_theme.dart';
import '../../providers/feed_provider.dart';
import '../../screens/category/category_screen.dart';
import '../../screens/feed/feed_screen.dart';
import '../../screens/notification/notifications_screen.dart';
import '../../screens/profile/mine_screen.dart';
import '../../screens/upload/upload_screen.dart';
/// 首页壳:底部 Tab(首页/分类/发布/消息/我的),02-技术文档信息架构
/// 首页 Tab 为 Feed 播放页,我的页已接入,其余 Tab 随迭代接入;IndexedStack 保活各 Tab 状态
class HomeShell extends StatefulWidget {
/// IndexedStack 保活各 Tab 状态(Feed 播放器池 / 分类滚动位置 / 上传流程不被销毁)
class HomeShell extends ConsumerStatefulWidget {
const HomeShell({super.key});
@override
State<HomeShell> createState() => _HomeShellState();
ConsumerState<HomeShell> createState() => _HomeShellState();
}
class _HomeShellState extends State<HomeShell> {
class _HomeShellState extends ConsumerState<HomeShell> {
int _index = 0;
/// Feed 三种策略的 provider keys(切 Tab 时用于暂停/恢复播放器池)
static const _feedStrategies = FeedStrategy.values;
void _onTabSelected(int i) {
if (i == _index) return;
// 切到非首页:暂停所有 Feed 策略的播放器池(IndexedStack 保活,否则声音会继续)
if (i != 0) {
for (final s in _feedStrategies) {
ref.read(feedProvider(s).notifier).pool.pauseCurrent();
}
}
setState(() => _index = i);
// 切回首页:恢复当前策略播放(FeedScreen 内部 _strategy 是 recommend)
if (i == 0) {
ref.read(feedProvider(FeedStrategy.recommend).notifier).pool.playCurrent();
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
@@ -23,9 +46,9 @@ class _HomeShellState extends State<HomeShell> {
index: _index,
children: const [
FeedScreen(),
_TabPlaceholder('分类'),
_TabPlaceholder('发布'),
_TabPlaceholder('消息'),
CategoryScreen(),
UploadScreen(),
NotificationsScreen(),
MineScreen(),
],
),
@@ -33,7 +56,7 @@ class _HomeShellState extends State<HomeShell> {
backgroundColor: AppColors.surface,
indicatorColor: AppColors.primary.withValues(alpha: 0.2),
selectedIndex: _index,
onDestinationSelected: (i) => setState(() => _index = i),
onDestinationSelected: _onTabSelected,
destinations: const [
NavigationDestination(
icon: Icon(Icons.home_outlined),
@@ -61,20 +84,3 @@ class _HomeShellState extends State<HomeShell> {
);
}
}
/// Tab 占位(迭代期)
class _TabPlaceholder extends StatelessWidget {
const _TabPlaceholder(this.title);
final String title;
@override
Widget build(BuildContext context) {
return Center(
child: Text(
'$title(随迭代接入)',
style: const TextStyle(color: AppColors.textSecondary, fontSize: 15),
),
);
}
}