【Flutter】Tableで表を簡単に作る方法!

対象者

  • Flutterを用いたアプリ開発に携わっているが、Tableウィジェットについての知識が不十分な方
  • 表形式のデータを効率的に表示したいと考えている方
  • アプリ開発スキルを向上させ、チームメンバーからの評価を高めたい方

はじめに

Flutterアプリ開発に取り組んでいる皆さん、表形式のデータを綺麗に表示したいと思ったことはありませんか?この記事は、FlutterのTableウィジェットを効果的に使いこなすための情報が詰まっています。Tableウィジェットの基本的な使い方から、複数行・複数列での利用方法、さらにはサイズが異なるウィジェットの配置方法まで、幅広く解説しています。

また、Tableウィジェットの実装方法に関しても、TableRowの追加や動的なTableRowの生成といった詳細な情報が提供されています。さらに、スクロール付きの表の実装方法にも触れており、SingleChildScrollViewの使用方法やDataTableの活用方法についても説明しています。

この記事を読めば、あなたもFlutterのTableウィジェットを使いこなせるようになり、アプリ開発スキルが向上すること間違いなしです。チームメンバーからの評価も高まることでしょう。ぜひ、この記事を参考にして、表形式のデータを美しく表示するアプリを開発してみてください。皆さんのアプリ開発がさらなる高みへと到達することを願っています。

FlutterのTableウィジェットについて

Tableウィジェットは、ウィジェットをテーブル状に配置するための便利なウィジェットです。ColumnやRowウィジェットでも同様のことができますが、複数行・複数列の場合や、サイズが異なるウィジェットを配置する際には、Tableが適切です。

基本的な使い方

Tableウィジェットを使って簡単なテーブルを作る方法は、まず「children」とTableRowを使って配置します。以下のように、Tableウィジェットを必要な場所に配置し、TableRowを追加することができます。

Table(
  children: [
    TableRow(
      children: [
        Text('A1'),
        Text('B1'),
      ],
    ),
    TableRow(
      children: [
        Text('A2'),
        Text('B2'),
      ],
    ),
  ],
),

Tableウィジェットは、複数行・複数列のテーブルを作成するのに適しています。上記の例では、2行2列のシンプルなテーブルを作成していますが、必要に応じてさらに行や列を追加することができます。

サイズが異なるウィジェットの配置

Tableウィジェットは、特にグリッドの中のウィジェットのサイズがそれぞれ異なる場合に効果的です。例えば、以下のように異なるサイズのウィジェットを配置することができます。

Table(
  children: [
    TableRow(
      children: [
        Container(
          width: 100,
          height: 50,
          color: Colors.red,
        ),
        Container(
          width: 50,
          height: 50,
          color: Colors.green,
        ),
      ],
    ),
    TableRow(
      children: [
        Container(
          width: 75,
          height: 100,
          color: Colors.blue,
        ),
        Container(
          width: 75,
          height: 100,
          color: Colors.yellow,
        ),
      ],
    ),
  ],
),

この例では、1行目には幅が100の赤いボックスと幅が50の緑のボックスが配置されており、2行目には高さが100の青いボックスと黄色のボックスが配置されています。Tableウィジェットを使うことで、このような異なるサイズのウィジェットを簡単に配置することができます。

Tableウィジェットの実装方法

Tableウィジェットを使用して、独自のテーブルを作成する際の実装方法にはいくつかの手順があります。ここでは、TableRowの追加方法と動的なTableRowの生成方法について説明します。

TableRowの追加

TableRowは、Tableウィジェットの行を構成するウィジェットです。Tableウィジェットのchildrenプロパティにリスト形式でTableRowを追加することで、行を構成できます。以下の例では、2行2列のシンプルなテーブルを作成しています。

Table(
  children: [
    TableRow(
      children: [
        Text('A1'),
        Text('B1'),
      ],
    ),
    TableRow(
      children: [
        Text('A2'),
        Text('B2'),
      ],
    ),
  ],
),

この例では、Tableウィジェットの中に2つのTableRowがあり、それぞれに2つのTextウィジェットが配置されています。

動的なTableRowの生成

一般的に、テーブルの行数や列数が固定でない場合や、データが動的に変化する場合は、プログラムで動的にTableRowを生成することが望ましいです。これを実現するために、リストやデータを使ってTableRowを生成することができます。以下の例では、リストから動的にTableRowを生成しています。

// データリスト
final List<List<String>> data = [  ['A1', 'B1'],
  ['A2', 'B2'],
  ['A3', 'B3'],
];

// TableRowの動的生成
List<TableRow> _buildTableRows() {
  return data.map((row) {
    return TableRow(
      children: row.map((cell) => Text(cell)).toList(),
    );
  }).toList();
}

// Tableウィジェット
Table(
  children: _buildTableRows(),
),

この例では、_buildTableRows()関数を使って、データリストからTableRowを動的に生成しています。この方法により、データが変更された場合でも柔軟に対応できるテーブルを作成することができます。

スクロール付きの表の実装

大きなデータセットを扱う際や、画面サイズが限られている場合、スクロールを持つテーブルが役立ちます。Flutterでは、SingleChildScrollViewとDataTableを使用してスクロール付きの表を実装することができます。

SingleChildScrollViewの使用

SingleChildScrollViewは、子ウィジェットをスクロールできるようにするウィジェットです。これを使って、Tableウィジェットを縦方向、横方向、または両方向にスクロールできるようにできます。以下の例では、Tableウィジェットを縦方向にスクロールできるように実装しています。

SingleChildScrollView(
  scrollDirection: Axis.vertical,
  child: Table(
    children: _buildTableRows(), // 前の例で定義した _buildTableRows() 関数を使用
  ),
),

scrollDirectionプロパティをAxis.horizontalに設定することで、横方向のスクロールも可能になります。また、Axis.bothに設定することで、縦横両方向にスクロールすることができます。

DataTableの使用

Flutterでは、DataTableウィジェットを使って、より高度なスクロール付きの表を実装することもできます。DataTableは、列ヘッダーやソート機能、選択機能などを持つ表を作成できます。

以上で、スクロール付きの表の実装方法について、SingleChildScrollViewとDataTableの使用例を説明しました。これらのウィジェットを活用することで、さまざまなシーンでのスクロール可能なテーブルの実装が可能です。

Tableの主要なプロパティ

children (List)

表の各行を表すTableRowウィジェットのリストです。TableRowウィジェットは、各セルに配置するウィジェットをchildrenプロパティに持ちます。

columnWidths (Map<int, TableColumnWidth>)

各列の幅を指定するマップです。キーは列のインデックスで、値はTableColumnWidth型のオブジェクトです。IntrinsicColumnWidth、FixedColumnWidth、FractionColumnWidthなど、幅を設定する方法がいくつか用意されています。

defaultColumnWidth (TableColumnWidth)

columnWidthsで指定されていない列の幅を設定するための引数です。これもTableColumnWidth型のオブジェクトで指定します。

textDirection (TextDirection)

表のテキスト方向を指定します。TextDirection.ltr(左から右)またはTextDirection.rtl(右から左)を選択できます。

border (TableBorder)

表のボーダーを指定するための引数です。TableBorderクラスを使用して、外側のボーダーや内側のボーダー、ボーダーの太さや色などを設定できます。

defaultVerticalAlignment (TableCellVerticalAlignment)

セル内のウィジェットの垂直方向の配置を指定します。TableCellVerticalAlignment型で、baseline、top、middle、bottomを選択できます。

textBaseline (TextBaseline)

textDirectionがTextDirection.ltrまたはTextDirection.rtlの場合に使用される、テキストのベースラインを指定します。TextBaseline.alphabeticまたはTextBaseline.ideographicを選択できます。

Q&A

Q1: FlutterでTableウィジェットを使って複数行・複数列の表を作成する方法は?

A1: FlutterのTableウィジェットを使って複数行・複数列の表を作成するには、TableウィジェットのchildrenプロパティにTableRowウィジェットを追加していきます。TableRowウィジェットのchildrenプロパティには、各セルに配置するウィジェットを追加していくことで、簡単に複数行・複数列の表を作成できます。

Q2: SingleChildScrollViewを使用してスクロール付きの表を実装する方法は?

A2: SingleChildScrollViewを使用してスクロール付きの表を実装するには、TableウィジェットをSingleChildScrollViewウィジェットの子要素として配置します。これにより、表が画面サイズを超えた場合にスクロールが可能になります。また、SingleChildScrollViewウィジェットのscrollDirectionプロパティを設定することで、スクロール方向を制御できます。

Q3: Flutterで動的にTableRowを生成する方法は?

A3: Flutterで動的にTableRowを生成するには、List.generate関数を使用して、TableRowウィジェットのリストを作成します。その後、Tableウィジェットのchildrenプロパティに作成したリストを設定することで、動的にTableRowを生成できます。例えば、データソースに応じて表の行数を変更する場合にこの方法が適しています。

Q4: Tableの行毎に色を付けるには?

A4: Tableの行毎に色を付けるには、TableRowウィジェットのdecorationプロパティを使用します。BoxDecorationクラスを利用して背景色や枠線を設定できます

TableRow(
  decoration: BoxDecoration(
    color: Colors.red,
    border: Border.all(width: 1, color: Colors.yellow),
  ),
),

Q5: Tableの列を特定の比率にするには?

A5: Tableの列を特定の比率にするには、TableウィジェットのcolumnWidthsプロパティを使用します。FlexColumnWidthクラスを利用して各列の幅を指定することで、列の幅を比率で設定できます。

Table(
  columnWidths: {
    0: FlexColumnWidth(1),
    1: FlexColumnWidth(2),
    2: FlexColumnWidth(3),
  },
),

まとめ

FlutterのTableウィジェットを利用して、効率的で見やすい表の作成が可能です。特に初心者にもわかりやすい方法で表を実装する方法を解説しました。以下の内容を学びました。

  1. 基本的なTableウィジェットの使い方
  2. 複数行・複数列の表の利用方法
  3. サイズが異なるウィジェットの配置方法
  4. TableRowの追加と動的な生成方法
  5. スクロール付きの表の実装方法

これらの知識を活用することで、初心者でも簡単にFlutterを使った表のあるアプリケーションを作成できます。是非、この記事を参考にして自分のプロジェクトに取り組んでみてください。

参考

全ソース

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> {
  final List<List<String>> data = [
    ['A1', 'B1'],
    ['A2', 'B2'],
    ['A3', 'B3'],
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('・基本的な使い方'),
            Table(
              children: [
                TableRow(
                  children: [
                    Text('A1'),
                    Text('B1'),
                  ],
                ),
                TableRow(
                  children: [
                    Text('A2'),
                    Text('B2'),
                  ],
                ),
              ],
            ),
            Text('・サイズが異なるウィジェットの配置'),
            Table(
              children: [
                TableRow(
                  children: [
                    Container(
                      width: 100,
                      height: 50,
                      color: Colors.red,
                    ),
                    Container(
                      width: 50,
                      height: 50,
                      color: Colors.green,
                    ),
                  ],
                ),
                TableRow(
                  children: [
                    Container(
                      width: 75,
                      height: 100,
                      color: Colors.blue,
                    ),
                    Container(
                      width: 75,
                      height: 100,
                      color: Colors.yellow,
                    ),
                  ],
                ),
              ],
            ),
            Text('・動的なTableRowの生成'),
            Table(
              children: _buildTableRows(),
            ),
            Text('・スクロール付きの表の実装'),
            SizedBox(
              height: 100,
              child: SingleChildScrollView(
                scrollDirection: Axis.vertical,
                child: Table(
                    children: List.generate(100, (index) => index).map((no) {
                  return TableRow(
                    children: [Text('$no')],
                  );
                }).toList()),
              ),
            ),
            Text('・プロパティ'),
            Table(
              border: TableBorder.all(),
              defaultVerticalAlignment: TableCellVerticalAlignment.top,
              defaultColumnWidth: FlexColumnWidth(1.0),
              columnWidths: {1: FractionColumnWidth(.2)},
              textDirection: TextDirection.ltr,
              textBaseline: TextBaseline.alphabetic,
              children: _buildTableRows(),
            ),
          ],
        ),
      ),
    );
  }

  // TableRowの動的生成
  List<TableRow> _buildTableRows() {
    return data.map((row) {
      return TableRow(
        children: row.map((cell) => Text(cell)).toList(),
      );
    }).toList();
  }
}