SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Flutterで始めるモバイルアプリ開発

Flutterのマテリアルデザインで用意されているウィジェットを紹介【Dialog/BottomSheet/SnackBar編】

Flutterで始めるモバイルアプリ開発 第19回


  • X ポスト
  • このエントリーをはてなブックマークに追加

BottomSheet

 BottomSheetは、画面下部からポップアップ表示されるウィジェットです。ただし、厳密にはBottomSheetというウィジェットはありません。表示するウィジェットは任意に作成し、showBottomSheetという関数から表示されるウィジェットがBottomSheetとして機能します。ダイアログと似ていますが、画面下部で表示されるため、全体の画面をできるだけ隠さず表示することが可能です。

 リスト4がBottomSheetを利用する場合の簡単なコード例で、その実行結果が図3です。

図3:BottomSheetの実行例
[リスト4] 標準的なBottomSheetの利用例(lib/sheet/BottomSheetWidget.dartの抜粋)
Widget build(BuildContext context) {
    return SafeArea(
        child: Container(
            color: Colors.white,
            alignment: Alignment.center,
            child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                    OutlinedButton(
                        child: Text("Bottom sheet"),
                        onPressed: (){
                            // (1) BottomSheetを表示する
                            showBottomSheet(
                                context: context,
                                builder: (context) {
                                    return createBottomSheet(context);
                                });
                        }),
                        // : (省略)
                    ]
    )));
}

// (2) BottomSheetとして表示するウィジェット
Widget createBottomSheet(BuildContext context) {
    return Container(
        margin: EdgeInsets.only(top : 0, bottom : 48.0),
        child: Wrap(
            children: [
                ListTile(
                    title: Text("以下から選択してください"),
                        tileColor: Colors.black,
                        textColor: Colors.white,
                ),
                ListTile(
                    title: Text("選択肢(1)"),
                ),
                // : (省略)
            ],
        ),
    );
}

 (1)のように表示するウィジェットはbuilderプロパティで指定します。実際に表示するウィジェットは(2)で作成しています。このようにウィジェットは自由に作成することが可能です。また、(1)のshowBottomSheetの代わりにshowModalBottomSheetを利用すると、図4のようにモーダルモードでBottomSheetを表示することができます。

図4:モーダルモードでのBottomSheetの実行例

SnackBar

 SnackBarは主に処理の通知結果を表示するために使われるウィジェットです。また、直近の処理を取り消すといった操作ボタンを通知に含めたい場合のように、ちょっとした操作を含める場合にも利用可能です。

 リスト5がSnackBarを利用する場合の簡単なコード例で、その実行結果が図5です。

図5:SnackBarの実行例
[リスト5] SnackBarの利用例(lib/snackbar/SnackbarWidget.dartの抜粋)
Widget build(BuildContext context) {
    return SafeArea(
        child: Container(
            width: double.infinity,
            child:
                Column(
                mainAxisAlignment: MainAxisAlignment.center,

                children: [
                    OutlinedButton(
                        child: Text("Create snackbar(1)"),
                        onPressed: (){
                            //  (1) 表示する
                            ScaffoldMessenger.of(context).showSnackBar(
                                createSnackBar1(context)
                            );
                        }
                    ),
                    // : (省略)
                    ])),
    );
}

SnackBar createSnackBar1(BuildContext context){
    // (2) SnackBarウィジェットの作成
    return SnackBar(
      content: Text("削除しました"),
      action: SnackBarAction(
        label: "取消",
        onPressed: (){
            // : (省略)
        },
      ),
    );
}

 SnackBarウィジェットを表示するためには(1)のようにScaffoldMessengerを使って表示を行います。また、表示するSnackBarウィジェットはshowSnackBarメソッドで指定し、(2)で作成しています。表示する本文はcontentで指定し、アクションが必要な場合にはactionsプロパティに指定します。

 また、図6で示すような表示方法にも変更することが可能で、その場合のコードがリスト6です。

図6:SnackBarの表示変更例
[リスト6] SnackBarの利用例(lib/snackbar/SnackbarWidget.dartの抜粋)
SnackBar createSnackBar2(BuildContext context){
    return SnackBar(
        content: Text("削除しました"),
        // (1) 表示方法
        behavior: SnackBarBehavior.floating,
        // (2) 表示する時間
        duration: Duration(milliseconds: 2000),
        backgroundColor: Colors.red,
        action: SnackBarAction(
            // : (省略)
        ),
    );
}

 (1)では、表示方法を画面下部とセットにせずに表示しています。そして、表示する時間も(2)のdurationプロパティで変更可能です。

まとめ

 これまで、マテリアルデザインを用いたコンポーネントを紹介してきました。また、本連載で紹介できなかったコンポーネントも多数あります。

 このようにFlutterにはさまざまなコンポーネントがあり、そして、カスタマイズするためのプロパティも多く提供されているために、実際にどこまでカスタマイズできるのかわかりにくいところもあります。しかし、多くの場合にはMaterial Designのコンポーネントで分かると思うので、実際にいろいろと試して覚えていくとよいでしょう。

 次回は、5/12にリリースされたFlutter3について紹介します。これまで紹介してきたMaterial Designも新たにバージョン3となり変更が加わっていますので、その点にも着目したいと思います。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Flutterで始めるモバイルアプリ開発連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15887 2022/09/05 20:24

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング