LoginSignup
13
4

More than 1 year has passed since last update.

[Flutter] 縦横スクロールできる表を作る

Posted at

縦横スクロールできる表をつくってみたので紹介します。
Oct-22-2022 10-07-47.gif

コード

Widget _table(List<DataColumn> columnList, List<DataRow> rowList) {
    // ListViewで縦スクロール, SingleChildScrollViewで横スクロール設定している
    return ListView(
      children: [
        SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          child: DataTable(columns: columnList, rows: rowList),
        )
      ],
    );
  }

これだけでできるなんてFlutterすごい。。。

全文

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {

  final labels = List<DataColumn>.generate(5, (int index) => 
    DataColumn(label: Text("ラベル$index")
  ), growable: false);

  final values = List<DataRow>.generate(20, (int index) {
    return DataRow(cells: [
      DataCell(Text("山田$index郎")),
      const DataCell(Text("男性")),
      const DataCell(Text("2000/10/30")),
      const DataCell(Text("東京都港区")),
      const DataCell(Text("会社員")),
    ]);
  }, growable: false);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Padding(
          padding: const EdgeInsets.all(8.0),
          child: _table(labels, values),
        ));
  }

  Widget _table(List<DataColumn> columnList, List<DataRow> rowList) {
    // ListViewで縦スクロール, SingleChildScrollViewで横スクロール設定している
    return ListView(
      children: [
        SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          child: DataTable(columns: columnList, rows: rowList),
        )
      ],
    );
  }
}

DataTableの基本的な使い方はこちらが参考になりました。

TableをColumnやRowなどの子として使いたいときの注意点

tableウィジェットをColumnやRowなどの子として使いたいときは、そのまま配置すると表が見えなくなってしまいます。

ダメな例
Column(
    children: [
      const Text("顧客一覧"),
      _table(labels, values), 
    ]
)

これはテーブル自身が表示領域をどこまで広げていいのかわからなくなっているのが原因だと思います。
ので、改善案としてはExpandedウィジェットを使って 子ウィジェットが利用可能なスペースを目一杯埋めてあげるのが良さそうです。

改善例
Column(
    children: [
      const Text("顧客一覧"),
      Expanded(child: _table(labels, values)),
    ]
)

13
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
4