FlutterでサイドメニューをDrawerウィジェットで実装する方法を紹介します。常時表示しないけれど、よく使う機能をリスト化して畳んでおくことでユーザビリティを向上させることができます。今回は見た目の分かりやすさ重視で、リストにはアイコンも表示させます。
サイドメニュー(Drawer)の実装方法
Scaffoldの中にDrawerを記載することで実装できます。
記載の階層としてはappBar、bodyと同じです。
記載の一例は以下のような感じ。
Scaffold( appBar: AppBar( 略 ), drawer: Drawer( 略 ), body: 略 );
サイドメニュー(Drawer)のサンプル(アイコン付き)
以下サンプルを作成しました。

DrawerはListViewで作成します。
中にはDrawerHeader(省略可)と複数のListTileを記載します。
ListTileにはアイコンとテキストを配置、タップ時にメッセージが出力されるようになっています。
以下にコードを示します。
サイドメニュー(Drawer)はSideMenuクラスで定義してます。
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.yellow),
),
home: const MyHomePage(title: 'Drawer Demo'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
// Drawer生成
var drawer = const Drawer(
child: SideMenu(),
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
// Drawerを設定
drawer: drawer,
body: const Center(
child: Text(
'Drawer Sample',
),
),
);
}
}
// サイドメニュー(Drawer)
class SideMenu extends StatelessWidget {
const SideMenu({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: [
DrawerHeader(
padding: const EdgeInsets.all(0),
margin: const EdgeInsets.all(10),
child: Container(
color: Colors.blue,
alignment: Alignment.center,
child: const Text('DrawerHeader'),
),
),
ListTile(
leading: Icon(Icons.search),
title: const Text('ListTile A'),
onTap: () {
debugPrint('リストタイル A をタップしました');
},
),
ListTile(
leading: const Icon(Icons.settings),
title: const Text('ListTile B'),
onTap: () {
debugPrint('リストタイル B をタップしました');
},
),
ListTile(
leading: const Icon(Icons.abc),
title: const Text('ListTile C'),
onTap: () {
debugPrint('リストタイル C をタップしました');
},
),
],
);
}
}
さいごに
Scaffoldはサイドバー(Drawer)含め色々用途が想定されていて良いですね。
スマホアプリのUI(デザイン)はいい方向に収束してると思うので、そのテンプレートなデザインを簡単に実装できる開発環境は魅力的ですね。







コメント