追加のアクションを促すダイアログ、モーダルボトムシート

ここではモーダルボトムシートの使い方を説明します。

Flutter では showModalBottomSheet 関数を用いることで、モーダルボトムシートを表示することができます。

モーダルボトムシートはモバイルアプリで、画面下部に補助的なメニューをモーダル表示するためのものです。 メニューの項目をどれか選択するか、スクリムをタップすることで操作をキャンセルすることで、シートを閉じます。

一般にモーダル表示のダイアログなどで、メニュー以外の部分に表示される影のような部分をスクリム scrim といいます。

ただし、スクリムのタップでキャンセル扱いなのは自動的に行われますが、メニューの選択時にシートを閉じるためには、明示的に Navigator を用いてスクリーンをスタックから pop する必要があります。

シート内のコンテンツは、自由に配置でき、ここでは Column ウィジェットを用いて、縦に ListTile を並べてメニューにしています。 それぞれの ListTile 内では leading にアイコンを、title にテキストを配置し、onTap イベントハンドラを設定しています。

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

void main() {
  debugPaintSizeEnabled = false;
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyApp(),
    ),
  );
}

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

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

  void _showModalBottomSheet() {
    showModalBottomSheet<void>(
      context: context,
      builder: (BuildContext context) {
        return Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            ListTile(
              leading: Icon(Icons.share),
              title: Text('Share'),
              onTap: () {
                setState(() => _label = 'You selected Share');
                Navigator.pop(context);
              },
            ),
            ListTile(
              leading: Icon(Icons.edit),
              title: Text('Edit'),
              onTap: () {
                setState(() => _label = 'You selected Edit');
                Navigator.pop(context);
              },
            ),
            ListTile(
              leading: Icon(Icons.delete),
              title: Text('Delete'),
              onTap: () {
                setState(() => _label = 'You selected Delete');
                Navigator.pop(context);
              },
            )
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Bottom Sheet 1'),
      ),
      body: Container(
        padding: EdgeInsets.all(16.0),
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceAround,
            children: <Widget>[
              Text(
                _label,
                style: TextStyle(
                  fontSize: 24.0,
                ),
              ),
              RaisedButton(
                child: Text('Show options'),
                onPressed: _showModalBottomSheet,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

以上、ここではモーダルボトムシートの使用例を紹介しました。

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

© 2024 Flutter 入門