app_layout.dart 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_riverpod/flutter_riverpod.dart';
  3. import 'package:veloe_kemono_party_flutter/models/nav_item.dart';
  4. class AppLayout extends ConsumerStatefulWidget {
  5. final List<NavItem> navItems;
  6. const AppLayout({super.key, required this.navItems});
  7. @override
  8. ConsumerState<AppLayout> createState() => _AppLayoutState();
  9. static openDrawer(BuildContext context) {
  10. final ScaffoldState? scaffoldState =
  11. context.findRootAncestorStateOfType<ScaffoldState>();
  12. scaffoldState?.openDrawer();
  13. }
  14. }
  15. class _AppLayoutState extends ConsumerState<AppLayout> {
  16. final _navIndex = StateProvider<int>((ref) => 0);
  17. Widget _buildDesktopNavRail(int selectedIndex) {
  18. return NavigationRail(
  19. selectedIndex: selectedIndex,
  20. onDestinationSelected: (index) =>
  21. ref.read(_navIndex.notifier).state = index,
  22. labelType: NavigationRailLabelType.all,
  23. destinations: widget.navItems.map((item) =>
  24. NavigationRailDestination(
  25. icon: Icon(item.icon),
  26. label: Text(item.label),
  27. )).toList(),
  28. );
  29. }
  30. Widget _buildMobileDrawer(int selectedIndex) {
  31. return Drawer(
  32. child: ListView(
  33. children: [
  34. const DrawerHeader(
  35. decoration: BoxDecoration(color: Color.fromARGB(255,40, 42, 46)),
  36. child: Text('Kemono', style: TextStyle(color: Colors.white)),
  37. ),
  38. ...widget.navItems.asMap().entries.map((entry) => ListTile(
  39. leading: Icon(entry.value.icon),
  40. title: Text(entry.value.label),
  41. selected: entry.key == selectedIndex,
  42. onTap: () {
  43. ref.read(_navIndex.notifier).state = entry.key;
  44. Navigator.pop(context);
  45. },
  46. )),
  47. ],
  48. ),
  49. );
  50. }
  51. @override
  52. Widget build(BuildContext context) {
  53. final selectedIndex = ref.watch(_navIndex);
  54. final isDesktop = MediaQuery.of(context).size.width >= 600;
  55. return Scaffold(
  56. drawer: isDesktop ? null : _buildMobileDrawer(selectedIndex),
  57. body: Row(
  58. children: [
  59. if (isDesktop) _buildDesktopNavRail(selectedIndex),
  60. Expanded(child: widget.navItems[selectedIndex].page),
  61. ],
  62. ),
  63. );
  64. }
  65. }