Flutter

Flutter StatefulWidgetの使い方|状態を持つ画面を作る基本

FlutterのStatefulWidgetを初心者向けに解説します。StatelessWidgetとの違い、Stateクラス、setState、カウンター例を使って状態更新の流れを整理します。

この記事の目次
  1. この記事の結論
  2. StatefulWidgetの最小構成
  3. ボタンで状態を変える
  4. 完成形の小さなカウンター
  5. StatelessWidgetとの使い分け
  6. 実装後に確認すること
  7. よくあるつまずき
  8. 次に読む記事
  9. まとめ

StatefulWidgetは、画面内で変わる値を持つWidgetです。ボタンを押すと数字が増える、読み込み中から完了に変わる、入力内容に応じて表示を変える、といった場面で使います。

この記事の結論

StatefulWidgetはWidget本体とStateクラスの2つで構成します。変化する値はState側に置き、値を変えたらsetStateで再描画します。

StatefulWidgetの最小構成

class CounterPage extends StatefulWidget {
  const CounterPage({super.key});

  @override
  State<CounterPage> createState() => _CounterPageState();
}

class _CounterPageState extends State<CounterPage> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Text("count: $count");
  }
}

ボタンで状態を変える

値を変更しただけでは画面は更新されません。setStateの中で値を変更すると、Flutterが再度buildを呼びます。

ElevatedButton(
  onPressed: () {
    setState(() {
      count++;
    });
  },
  child: const Text("増やす"),
)

完成形の小さなカウンター

class CounterPage extends StatefulWidget {
  const CounterPage({super.key});

  @override
  State<CounterPage> createState() => _CounterPageState();
}

class _CounterPageState extends State<CounterPage> {
  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text("count: $count"),
        ElevatedButton(
          onPressed: () => setState(() => count++),
          child: const Text("増やす"),
        ),
      ],
    );
  }
}

StatelessWidgetとの使い分け

  • 表示内容が外から渡されるだけならStatelessWidget
  • Widget内で値が変わるならStatefulWidget
  • アプリ全体で共有する状態はProviderやRiverpodも検討
  • 小さな画面内の状態ならまずStatefulWidgetで十分

実装後に確認すること

  • ボタンを押して値が変わるか
  • 変化する値をState側に置いているか
  • setState内で状態を変更しているか
  • 複雑な状態を1つのWidgetに詰め込みすぎていないか

よくあるつまずき

  • StatefulWidget本体に変化する値を置く
  • 値を変えたのにsetStateを呼ばない
  • build内で重い処理を実行する
  • 小さな状態管理にいきなり大きな設計を持ち込む

次に読む記事

まとめ

StatefulWidgetはFlutterで状態を持つ画面を作る基本です。Stateクラスに値を置き、setStateで変更し、buildが再実行される流れを理解しましょう。