1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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<NavItem> navItems;
-
- const AppLayout({super.key, required this.navItems});
- @override
- ConsumerState<AppLayout> createState() => _AppLayoutState();
- }
- class _AppLayoutState extends ConsumerState<AppLayout> {
- final _navIndex = StateProvider<int>((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: Colors.blue),
- child: Text('Navigation', 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(
- appBar: AppBar(
- title: Text(widget.navItems[selectedIndex].label),
- leading: isDesktop ? null : Builder(
- builder: (context) => IconButton(
- icon: const Icon(Icons.menu),
- onPressed: () => Scaffold.of(context).openDrawer(),
- ),
- ),
- ),
- drawer: isDesktop ? null : _buildMobileDrawer(selectedIndex),
- body: Row(
- children: [
- if (isDesktop) _buildDesktopNavRail(selectedIndex),
- Expanded(child: widget.navItems[selectedIndex].page),
- ],
- ),
- );
- }
- }
|