import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:veloe_kemono_party_flutter/models/nav_item.dart'; class AppLayout extends ConsumerStatefulWidget { final List navItems; const AppLayout({super.key, required this.navItems}); @override ConsumerState createState() => _AppLayoutState(); static openDrawer(BuildContext context) { final ScaffoldState? scaffoldState = context.findRootAncestorStateOfType(); scaffoldState?.openDrawer(); } } class _AppLayoutState extends ConsumerState { final _navIndex = StateProvider((ref) => 0); Widget _buildDesktopNavRail(int selectedIndex) { return NavigationRail( selectedIndex: selectedIndex, onDestinationSelected: (index) => ref.read(_navIndex.notifier).state = index, labelType: NavigationRailLabelType.all, destinations: widget.navItems.map((item) => NavigationRailDestination( icon: Icon(item.icon), label: Text(item.label), )).toList(), ); } Widget _buildMobileDrawer(int selectedIndex) { return Drawer( child: ListView( children: [ const DrawerHeader( decoration: BoxDecoration(color: Color.fromARGB(255,40, 42, 46)), child: Text('Kemono', style: TextStyle(color: Colors.white)), ), ...widget.navItems.asMap().entries.map((entry) => ListTile( leading: Icon(entry.value.icon), title: Text(entry.value.label), selected: entry.key == selectedIndex, onTap: () { ref.read(_navIndex.notifier).state = entry.key; Navigator.pop(context); }, )), ], ), ); } @override Widget build(BuildContext context) { final selectedIndex = ref.watch(_navIndex); final isDesktop = MediaQuery.of(context).size.width >= 600; return Scaffold( drawer: isDesktop ? null : _buildMobileDrawer(selectedIndex), body: Row( children: [ if (isDesktop) _buildDesktopNavRail(selectedIndex), Expanded(child: widget.navItems[selectedIndex].page), ], ), ); } }