// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/material.dart'; import '../utils.dart'; import 'use_cases.dart'; class ExampleDestination { const ExampleDestination(this.label, this.icon, this.selectedIcon); final String label; final Widget icon; final Widget selectedIcon; } const List destinations = [ ExampleDestination('Messages', Icon(Icons.widgets_outlined), Icon(Icons.widgets)), ExampleDestination('Profile', Icon(Icons.format_paint_outlined), Icon(Icons.format_paint)), ExampleDestination('Settings', Icon(Icons.settings_outlined), Icon(Icons.settings)), ]; class NavigationDrawerUseCase extends UseCase { @override String get name => 'NavigationDrawer'; @override String get route => '/navigation-drawer'; @override Widget build(BuildContext context) => const NavigationDrawerExample(); } class NavigationDrawerExample extends StatefulWidget { const NavigationDrawerExample({super.key}); @override State createState() => _NavigationDrawerExampleState(); } class _NavigationDrawerExampleState extends State { final GlobalKey scaffoldKey = GlobalKey(); int screenIndex = 0; late bool showNavigationDrawer; void handleScreenChanged(int selectedScreen) { setState(() { screenIndex = selectedScreen; }); } void openDrawer() { scaffoldKey.currentState!.openEndDrawer(); } String pageTitle = getUseCaseName(NavigationDrawerUseCase()); Widget buildDrawerScaffold(BuildContext context) { return Scaffold( key: scaffoldKey, appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Semantics(headingLevel: 1, child: Text('$pageTitle Demo')), ), body: SafeArea( bottom: false, top: false, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Text('Page Index = $screenIndex'), ElevatedButton(onPressed: openDrawer, child: const Text('Open Drawer')), ], ), ), ), endDrawer: NavigationDrawer( onDestinationSelected: handleScreenChanged, selectedIndex: screenIndex, children: [ Padding( padding: const EdgeInsets.fromLTRB(28, 16, 16, 10), child: Text('Header', style: Theme.of(context).textTheme.titleSmall), ), ...destinations.map((ExampleDestination destination) { return NavigationDrawerDestination( label: Text(destination.label), icon: destination.icon, selectedIcon: destination.selectedIcon, ); }), const Padding(padding: EdgeInsets.fromLTRB(28, 16, 28, 10), child: Divider()), ], ), ); } @override Widget build(BuildContext context) { return buildDrawerScaffold(context); } }