個人開発者が勉強がてらまとめているだけのサイトです

セグメントボタン Segmented Button

2〜5個のボタンが1本につながっていて、選んだものだけが塗られる。「日・週・月」の切り替えなどに使う。

別名
セグメンテッドコントロール切り替えボタン期間切り替え横並びの選択ボタンSegmented ControlSliding Segmented Control
動き
つながったボタン選んだ所が塗られるiOS は滑って移る
作り方
標準ウィジェット Flutter に入っているものだけで作れます

本物の Flutter ウィジェットが動きます(初回は数秒かかります)

別タブで大きく開く ↗

どんなもの?

少ない選択肢から1つ(または複数)を選ぶ、横並びのボタンです。

Material 3 では SegmentedButton を使い、segments に ButtonSegment を並べ、selected に選ばれている値の Set を渡します。

multiSelectionEnabled: true で複数選べるようになり、showSelectedIcon: false で選択中のチェックを消せます。

iOS 風にしたいときは CupertinoSlidingSegmentedControl で、選んだ所へ白い板が滑って移ります。

Web では日本語フォントが後から読み込まれて文字が折り返すことがあるので、幅を固定しておくと安全です。

こんなときに

  • 2〜5個の選択肢から選び、選んだ結果がすぐ画面に反映される(グラフの期間・表示の切り替え)

避けたい場面

  • 選択肢が6個以上(ドロップダウンやチップにする)

最小コード

SegmentedButton<String>(
  segments: const [
    ButtonSegment(value: 'day', label: Text('日')),
    ButtonSegment(value: 'week', label: Text('週')),
    ButtonSegment(value: 'month', label: Text('月')),
  ],
  selected: {period},
  onSelectionChanged: (s) => setState(() => period = s.first),
)

// iOS 風
CupertinoSlidingSegmentedControl<int>(
  groupValue: tab,
  onValueChanged: (v) => setState(() => tab = v!),
  children: const {0: Text('地図'), 1: Text('航空写真')},
)

使うウィジェット

SegmentedButtonButtonSegmentCupertinoSlidingSegmentedControl

似ているもの・一緒に見たいもの

触ってみる ↗
ボタン トグルボタンToggle Buttons

太字・斜体・下線のように、つながったアイコンボタンを押すたびにオンとオフが切り替わる。

押すたびオン・オフ
触ってみる ↗
ボタン チップChips

小さな角丸のボタン。絞り込み・並び替えの選択、入力したタグの表示、すぐ実行できる提案などに使う。

押すと選択
触ってみる ↗
ナビゲーション タブバー(上タブ)Tab Bar

画面上部にカテゴリ名が横に並び、押すか中身を左右にスワイプすると切り替わる。選択中の下線が付いてくる。

横にスワイプ