標準的で使いやすいサイドメニューを簡単に実装する Drawer

モバイルアプリではメニューリストが左側からスライドして表示されるのは、非常に一般的になっています。 マテリアルデザインではこうしたメニューリストはドロワー (Drawer) としてサポートされています。

Scaffold にはちゃんと drawer プロパティが用意されています。 drawer プロパティに Drawer ウィジェットをセットすることで、左側からスライドインするメニューを簡単に実装することができます。

ここでは Drawer の基本的な実装方法を示します。

ランドスケープ表示。ドロワーの内容がスクロールできています。

コードは次の通りです。Scaffolddrawer プロパティに Drawer ウィジェットをセットしているところがポイントです。

import 'package:flutter/material.dart';

void main() => runApp(
      MaterialApp(
        debugShowCheckedModeBanner: false,
        home: MyApp(),
      ),
    );

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _State();
  }
}

class _State extends State<MyApp> {
  var _city = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Drawer Test'),
        ),
        drawer: Drawer(
          child: ListView(
            children: <Widget>[
              DrawerHeader(
                child: Text(
                  'My App',
                  style: TextStyle(
                    fontSize: 24,
                    color: Colors.white,
                  ),
                ),
                decoration: BoxDecoration(
                  color: Colors.blue,
                ),
              ),
              ListTile(
                title: Text('Los Angeles'),
                onTap: () {
                  setState(() => _city = 'Los Angeles, CA');
                  Navigator.pop(context);
                },
              ),
              ListTile(
                title: Text('Honolulu'),
                onTap: () {
                  setState(() => _city = 'Honolulu, HI');
                  Navigator.pop(context);
                },
              ),
              ListTile(
                title: Text('Dallas'),
                onTap: () {
                  setState(() => _city = 'Dallas, TX');
                  Navigator.pop(context);
                },
              ),
              ListTile(
                title: Text('Seattle'),
                onTap: () {
                  setState(() => _city = 'Seattle, WA');
                  Navigator.pop(context);
                },
              ),
              ListTile(
                title: Text('Tokyo'),
                onTap: () {
                  setState(() => _city = 'Tokyo, Japan');
                  Navigator.pop(context);
                },
              ),
            ],
          ),
        ),
        body: Center(
          child: Text(
            _city,
            style: TextStyle(
              fontSize: 32,
            ),
          ),
        ));
  }
}

ここではドロワー内のリンクをクリックした時に、元のページ内の真ん中に文字を表示しています。 表示の更新が必要なので setState を呼ぶ必要があります。

また、ドロワーを閉じるためにナビゲーションのスタックから pop しています。

ドロワー内のメニューからページ遷移するためにはラウトの設定が必要です。詳しくは「ページのナビゲーション 〜 ラウト設定と Navigator の pushNamed」をみてください。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Flutter 入門