app.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'providers/app_provider.dart';
  4. import 'pages/settings/settings_page.dart';
  5. import 'pages/home/home_page.dart';
  6. import 'pages/search/search_page.dart';
  7. import 'pages/carts/cart_list_page.dart';
  8. class TikuApp extends ConsumerStatefulWidget {
  9. const TikuApp({super.key});
  10. @override
  11. ConsumerState<TikuApp> createState() => _TikuAppState();
  12. }
  13. class _TikuAppState extends ConsumerState<TikuApp> {
  14. @override
  15. void initState() {
  16. super.initState();
  17. Future.microtask(() => ref.read(connectionProvider.notifier).initialize());
  18. }
  19. @override
  20. Widget build(BuildContext context) {
  21. final connState = ref.watch(connectionProvider);
  22. return MaterialApp(
  23. title: '某人的题库',
  24. debugShowCheckedModeBanner: false,
  25. theme: ThemeData(
  26. colorSchemeSeed: Colors.blue,
  27. useMaterial3: true,
  28. brightness: Brightness.light,
  29. appBarTheme: const AppBarTheme(centerTitle: true),
  30. ),
  31. home: connState.status == ConnectionStatus.configured
  32. ? const MainShell()
  33. : const SettingsPage(),
  34. );
  35. }
  36. }
  37. /// 主界面 Shell — 底部标签导航
  38. class MainShell extends ConsumerStatefulWidget {
  39. const MainShell({super.key});
  40. @override
  41. ConsumerState<MainShell> createState() => _MainShellState();
  42. }
  43. class _MainShellState extends ConsumerState<MainShell> {
  44. int _currentIndex = 0;
  45. final _pages = const [
  46. HomePage(),
  47. SearchPage(),
  48. CartListPage(),
  49. SettingsPage(),
  50. ];
  51. @override
  52. Widget build(BuildContext context) {
  53. return Scaffold(
  54. body: IndexedStack(index: _currentIndex, children: _pages),
  55. bottomNavigationBar: NavigationBar(
  56. selectedIndex: _currentIndex,
  57. onDestinationSelected: (i) => setState(() => _currentIndex = i),
  58. destinations: const [
  59. NavigationDestination(icon: Icon(Icons.library_books), label: '题库'),
  60. NavigationDestination(icon: Icon(Icons.search), label: '搜索'),
  61. NavigationDestination(icon: Icon(Icons.shopping_cart), label: '试题篮'),
  62. NavigationDestination(icon: Icon(Icons.settings), label: '设置'),
  63. ],
  64. ),
  65. );
  66. }
  67. }