【Flutter】ExpansionTileで開閉可能なリスト項目を作成

  • 2023年4月4日
  • 2023年4月4日
  • Widget

対象者

  • Flutterを使ったアプリ開発に携わっているが、ExpansionTileについての知識や使い方が不十分な人
  • 階層化されたデータを効果的に表示する方法を学びたいアプリ開発者
  • 自分の技術力を向上させ、アプリ開発プロジェクトでより良い成果を出したいプログラマーやエンジニア

はじめに

Flutter開発を始めたばかりのあなた。アプリ開発において、リスト表示や階層構造のデータを扱う場面は少なくありませんよね。そんな時に役立つのが、「ExpansionTile」というウィジェットです。しかし、初心者には少し難しいと感じるかもしれません。

この記事では、まさにそんなあなたのために、FlutterのExpansionTileをわかりやすく解説します。実例を紹介しながら、アプリ開発の効率を向上させるための情報を提供していきます。初心者の方も、この記事を読めばExpansionTileを活用してアプリ開発がスムーズに進むことでしょう。

本記事を読むことで、FlutterのExpansionTileの基本的な使い方はもちろん、実際のアプリ開発で役立つ応用例やコツも身につけることができます。

ExpansionTileとは

ExpansionTileは、Flutterで簡単に展開・収束するリストを作成できるウィジェットです。このウィジェットを使用すると、コンパクトなリストを提供し、ユーザーが必要に応じて詳細を表示できます。

ExpansionTileの概要

ExpansionTileは、親子関係のあるリストアイテムを効率的に表示できます。親アイテムをタップすると、子アイテムが表示され、再度タップすると子アイテムが非表示になります。これにより、情報を隠してUIをすっきりさせることができます。

ExpansionTile(
  title: Text('親アイテム'),
  children: <Widget>[
    ListTile(title: Text('子アイテム1')),
    ListTile(title: Text('子アイテム2')),
  ],
)

ExpansionTileの利点

ExpansionTileを使用すると、ユーザーに必要な情報のみを表示し、その他の情報は展開してアクセスできるようにすることができます。これにより、UIがすっきりして操作が容易になります。

ExpansionTileの使い方

ExpansionTileはシンプルなウィジェットで、基本的な実装方法やカスタマイズ方法、イベントハンドリングなどが容易に学べます。

ExpansionTileの基本的な実装

ExpansionTileは、親アイテムのタイトルと子アイテムのリストを指定するだけで簡単に実装できます。

ExpansionTile(
  title: Text('親アイテム'),
  children: <Widget>[
    ListTile(title: Text('子アイテム1')),
    ListTile(title: Text('子アイテム2')),
  ],
)

カスタマイズ方法

ExpansionTileをカスタマイズするには、様々なプロパティを使用できます。例えば、leadingでアイコンを追加したり、backgroundColorで背景色を変更できます。さらに、ExpansionTileでは、leadingプロパティを使って、タイトルの左側にアイコンを追加することができます。また、trailingプロパティを使用すれば、タイトルの右側に独自のウィジェットを配置することが可能です。これにより、ExpansionTileをさらにカスタマイズし、ユーザーにとって視認性の高いデザインを実現できます。

さらに詳しく説明すると、例えば以下のようにコードを書くことで、leadingにアイコンを追加し、trailingに独自のウィジェットを配置できます。

ExpansionTile(
  title: Text('タイトル'),
  leading: Icon(Icons.folder_open),
  trailing: Checkbox(
    value: _checked,
          onChanged: (bool? value) {
            setState(() {
              _checked = value ?? false;
            });
        },
  ),
  children: [
    ListTile(
      title: Text('子要素1'),
    ),
    ListTile(
      title: Text('子要素2'),
    ),
  ],
)

このように、ExpansionTileの各プロパティを活用することで、アプリケーションの見た目や機能を自由にカスタマイズできます。これにより、ユーザーが使いやすいUIを実現し、アプリの使い勝手を向上させることができるでしょう。

最後に、ExpansionTileはListView.builderやListView.separatedと組み合わせることで、大量のデータを効率的に扱うことが可能です。これにより、パフォーマンスの向上や、アプリ開発の効率化が実現できます。

プロパティ

Widget? leading

リストタイルウィジェットの先頭と同様に、leadingプロパティはタイトルの最初の左側に使用されます。

Widget title

タイトルパラメータを使用して、ExpansionTileウィジェットのタイトルをカスタマイズできます。これは、ユーザーが常に見ることができる装置になります。

Widget? subtitle

タイトルの下にさらなる情報があります。

ValueChanged? onExpansionChanged

タイルが拡大し始めると、この関数は値trueで呼び出されます。タイルが折りたたみ始めると、この関数は値falseで呼び出されます。

List children

子供のプロパティには無数のウィジェットが格納されています。カードは短いテキストに使用できます。そして、拡張タイルがこれを見つける唯一の方法は、ウィジェットのタイトルをクリックすることです。

Widget? trailing

タイトルの右側にあり、アイコンとテキストウィジェットの両方を配置できる場所にtrailingプロパティを使用します。

bool initiallyExpanded

最初にリストタイルが拡張されているか(true)または折りたたまれているか(false、デフォルト)を示します。

bool maintainState:

タイルが拡大および縮小するときに子供たちの状態が保持されるかどうかを示します。

EdgeInsetsGeometry? tilePadding

この属性は、leading、title、subtitle、およびtailウィジェットのインセットを指定します。

CrossAxisAlignment? expandedCrossAxisAlignment

タイルが拡大されたときに、children内の各子がどのように配置されるかを説明します。

Alignment? expandedAlignment

タイルが拡張されたときに、列ウィジェットに配置された子供たちがどのように配置されるかを指定します。

EdgeInsetsGeometry? childrenPadding

子供たちのパディングが指定されます。

Color? backgroundColor

backgroundプロパティを使用して、拡張されたタイルの背景に色が与えられます。タイトルではなく、拡張されたタイルに色が与えられることに注意してください。

Color? collapsedBackgroundColor

サブリストが折りたたまれたときに、タイルの背景色を定義します。

Color? textColor

サブリストが拡張されている間、このプロパティは、タイル上のタイトルの色を設定するために使用されます。

Color? collapsedTextColor

サブリストが折りたたまれているときに、タイル上のタイトルの色を設定するために使用されます。

Color? iconColor

アイコンの色を設定するために使用されます。

Color? collapsedIconColor

折りたたまれた状態のアイコンの色を設定するために使用されます。

ListTileControlAffinity? controlAffinity

主に、拡張矢印インジケータをタイルの先頭または後尾に移動させるために使用されます。

Q&A

Q1: ExpansionTileはどのような用途で使用されるのですか?

A1: ExpansionTileは、親子関係のあるリストアイテムを効率的に表示し、情報を隠してUIをすっきりさせる目的で使用されます。コンパクトなリストを提供し、ユーザーが必要に応じて詳細を表示できる便利な機能です。

Q2: ExpansionTileの基本的な実装方法はどのようなものですか?

A2: ExpansionTileの利用方法はシンプルで、親アイテムのタイトルと子アイテムのリストを指定するだけで簡単に実装できます。例えば、以下のようなコードで実装が可能です。

ExpansionTile(
  title: Text('親アイテム'),
  children: <Widget>[
    ListTile(title: Text('子アイテム1')),
    ListTile(title: Text('子アイテム2')),
  ],
)

Q3: ExpansionTileのカスタマイズ方法について教えてください。

A3: ExpansionTileでは、様々なプロパティを使用してカスタマイズが可能です。例えば、アイコンの追加や背景色の変更など、自分好みのデザインに仕上げることができます。これにより、アプリのデザインに合わせて見た目を調整することができます。

まとめ

Flutterで使いやすい展開・収束リストを作成するためのウィジェット、ExpansionTileについて解説します。ExpansionTileは、コンパクトなリストを提供し、ユーザーが必要に応じて詳細を表示できる便利な機能です。親子関係のあるリストアイテムを効率的に表示し、情報を隠してUIをすっきりさせることができます。基本的な実装方法やカスタマイズ方法、イベントハンドリングなどが容易に学べるため、初心者にもおすすめです。

重要なポイント:

  • コンパクトなリストを提供し、詳細表示が可能
  • 親子関係のあるリストアイテムを効率的に表示
  • UIがすっきりし操作が容易になる
  • 基本的な実装方法やカスタマイズ方法が簡単に学べる

ExpansionTileの利用方法はシンプルで、親アイテムのタイトルと子アイテムのリストを指定するだけで簡単に実装できます。さらにカスタマイズも可能で、アイコンの追加や背景色の変更など、様々なプロパティを使用して自分好みのデザインに仕上げることができます。この便利なウィジェットを活用して、より使いやすいアプリを開発しましょう。

全ソース

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  var _checked = false;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          children: [
            Card(
              child: ExpansionTile(
                title: Text('親アイテム'),
                children: <Widget>[
                  ListTile(title: Text('子アイテム1')),
                  ListTile(title: Text('子アイテム2')),
                ],
              ),
            ),
            Card(
              child: ExpansionTile(
                title: Text('タイトル'),
                backgroundColor: Colors.yellow,
                leading: Icon(Icons.folder_open),
                trailing: Checkbox(
                  value: _checked,
                  onChanged: (bool? value) {
                    setState(() {
                      _checked = value ?? false;
                    });
                  },
                ),
                children: [
                  ListTile(
                    title: Text('子要素1'),
                  ),
                  ListTile(
                    title: Text('子要素2'),
                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}