81 lines
2.2 KiB
Dart
81 lines
2.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import '../../core/theme/app_theme.dart';
|
|
import '../../screens/feed/feed_screen.dart';
|
|
import '../../screens/profile/mine_screen.dart';
|
|
|
|
/// 首页壳:底部 Tab(首页/分类/发布/消息/我的),02-技术文档信息架构
|
|
/// 首页 Tab 为 Feed 播放页,我的页已接入,其余 Tab 随迭代接入;IndexedStack 保活各 Tab 状态
|
|
class HomeShell extends StatefulWidget {
|
|
const HomeShell({super.key});
|
|
|
|
@override
|
|
State<HomeShell> createState() => _HomeShellState();
|
|
}
|
|
|
|
class _HomeShellState extends State<HomeShell> {
|
|
int _index = 0;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
body: IndexedStack(
|
|
index: _index,
|
|
children: const [
|
|
FeedScreen(),
|
|
_TabPlaceholder('分类'),
|
|
_TabPlaceholder('发布'),
|
|
_TabPlaceholder('消息'),
|
|
MineScreen(),
|
|
],
|
|
),
|
|
bottomNavigationBar: NavigationBar(
|
|
backgroundColor: AppColors.surface,
|
|
indicatorColor: AppColors.primary.withValues(alpha: 0.2),
|
|
selectedIndex: _index,
|
|
onDestinationSelected: (i) => setState(() => _index = i),
|
|
destinations: const [
|
|
NavigationDestination(
|
|
icon: Icon(Icons.home_outlined),
|
|
selectedIcon: Icon(Icons.home, color: AppColors.primary),
|
|
label: '首页',
|
|
),
|
|
NavigationDestination(
|
|
icon: Icon(Icons.grid_view_outlined),
|
|
label: '分类',
|
|
),
|
|
NavigationDestination(
|
|
icon: Icon(Icons.add_box_outlined),
|
|
label: '发布',
|
|
),
|
|
NavigationDestination(
|
|
icon: Icon(Icons.notifications_none),
|
|
label: '消息',
|
|
),
|
|
NavigationDestination(
|
|
icon: Icon(Icons.person_outline),
|
|
label: '我的',
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
/// 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),
|
|
),
|
|
);
|
|
}
|
|
}
|