Боковое меню Drawer в Flutter
Боковое меню выезжает слева и не занимает
место постоянно. Его задают в
Scaffold(drawer: ...) виджетом
Drawer.
Открыть можно иконкой «гамбургер» в
AppBar -
Flutter добавит её сам, если drawer
не пустой.
Вверху часто ставят DrawerHeader
с названием приложения. Пункты - это
ListTile
с onTap. Если нужен другой экран,
его открывают с контекста
Scaffold. После выбора раздела
шторку закрывают: Navigator.pop(context)
убирает overlay меню, основной экран
остаётся на месте:
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(home: MenuPage()));
}
class MenuPage extends StatefulWidget {
const MenuPage({super.key});
@override
State<MenuPage> createState() => _MenuPageState();
}
class _MenuPageState extends State<MenuPage> {
String section = 'Home';
void pick(String name) {
setState(() {
section = name;
});
Navigator.pop(context);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Menu')),
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: [
const DrawerHeader(
decoration: BoxDecoration(color: Colors.teal),
child: Align(
alignment: Alignment.bottomLeft,
child: Text(
'My app',
style: TextStyle(color: Colors.white, fontSize: 24),
),
),
),
ListTile(
leading: const Icon(Icons.home),
title: const Text('Home'),
onTap: () => pick('Home'),
),
ListTile(
leading: const Icon(Icons.settings),
title: const Text('Settings'),
onTap: () => pick('Settings'),
),
],
),
),
body: Center(child: Text('Section: $section')),
);
}
}
Добавьте пункт «About» с иконкой
Icons.info. По нажатию меняйте
текст в body на
'Version 1.0' и закрывайте
Drawer.