init
This commit is contained in:
108
client/lib/features/main/screens/main_app_screen.dart
Normal file
108
client/lib/features/main/screens/main_app_screen.dart
Normal file
@@ -0,0 +1,108 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../../home/screens/home_screen.dart';
|
||||
import '../../learning/screens/learning_home_screen.dart';
|
||||
import '../../profile/screens/profile_home_screen.dart';
|
||||
|
||||
/// 主应用界面,包含底部导航栏
|
||||
class MainAppScreen extends StatefulWidget {
|
||||
const MainAppScreen({super.key});
|
||||
|
||||
@override
|
||||
State<MainAppScreen> createState() => _MainAppScreenState();
|
||||
}
|
||||
|
||||
class _MainAppScreenState extends State<MainAppScreen> {
|
||||
int _currentIndex = 0;
|
||||
|
||||
final List<Widget> _pages = [
|
||||
const HomeScreen(),
|
||||
const LearningHomeScreen(),
|
||||
const ProfileHomeScreen(),
|
||||
];
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: IndexedStack(
|
||||
index: _currentIndex,
|
||||
children: _pages,
|
||||
),
|
||||
bottomNavigationBar: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Colors.white,
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Colors.black.withOpacity(0.1),
|
||||
blurRadius: 10,
|
||||
offset: const Offset(0, -2),
|
||||
),
|
||||
],
|
||||
),
|
||||
child: SafeArea(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 8.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: [
|
||||
_buildNavItem(
|
||||
icon: Icons.home,
|
||||
label: '首页',
|
||||
index: 0,
|
||||
),
|
||||
_buildNavItem(
|
||||
icon: Icons.school,
|
||||
label: '学习',
|
||||
index: 1,
|
||||
),
|
||||
_buildNavItem(
|
||||
icon: Icons.person,
|
||||
label: '我的',
|
||||
index: 2,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildNavItem({
|
||||
required IconData icon,
|
||||
required String label,
|
||||
required int index,
|
||||
}) {
|
||||
final isSelected = _currentIndex == index;
|
||||
final color = isSelected ? const Color(0xFF2196F3) : Colors.grey;
|
||||
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
setState(() {
|
||||
_currentIndex = index;
|
||||
});
|
||||
},
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(
|
||||
icon,
|
||||
color: color,
|
||||
size: 24,
|
||||
),
|
||||
const SizedBox(height: 2),
|
||||
Text(
|
||||
label,
|
||||
style: TextStyle(
|
||||
color: color,
|
||||
fontSize: 12,
|
||||
fontWeight: isSelected ? FontWeight.w600 : FontWeight.normal,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user