up
This commit is contained in:
@@ -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),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user