📑

Flutterでリストとスクロールしないグリッドを組み合わせる

2021/07/21に公開

Flutterでアプリ開発をしていてリストのセクション内のアイテムをグリッド状に表示したい場面があり、実装できたので紹介します。

使うWidget

実装に使うWidgetは以下の3つです。

  • CustomScrollView
  • SliverList
  • SliverGrid

CustomScrollViewの中にSliverListとSliverGridを子Widgetとして格納します。

CustomScrolView

CustomScrollViewには表示したいWidgetを格納します。

今回はSliverListとSliverGridを格納します。

Sliver系のWidget以外も配置することが可能です。

SliverList

SliverListはパラメータにSliverChildListDelegateを設定します。

SliverChildListDelegateのパラメータには表示したいWidgetの配列を格納します。

SliverList(
  delegate: SliverChildListDelegate(
    [
      ...,
    ],
  ),
)

SliverGrid

SliverGridはパラメータにSliverChildListDelegateとSliverGridDelegateWithFixedCrossAxisCountを設定します。

SliverChildListDelegateはSliverListと同様に表示するWidgetの配列を格納します。

SliverGridDelegateWithFixedCrossAxisCountは一列に表示する要素の数を設定します。

SliverGrid(
  delegate: SliverChildListDelegate(
		[
		...,
		]
	),
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
  ),
)

実装例

CustomScrollView(
    slivers: [
      SliverList(
        delegate: [
					...
				],
      ),
      SliverGrid(
        delegate: [
					...
				],
        gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 2,
        ),
      ),
    ],
  );
}

SliverListとSliverGridを組み合わせることで簡単に実現したいレイアウトを実装することができました。

ネイティブでは結構面倒なこともFlutterを使えば簡単に実装できるのもFlutterの良いところだと思います。

Discussion