Flutter

Flutter setStateの使い方|画面を更新する基本と注意点

FlutterのsetStateを初心者向けに解説します。値を変更して画面を更新する流れ、よくある書き方、非同期処理後の注意点を整理します。

この記事の目次
  1. この記事の結論
  2. setStateの基本形
  3. ボタンで表示を更新する
  4. 非同期処理のあとに使う
  5. setStateで管理しすぎない
  6. 実装後に確認すること
  7. よくあるつまずき
  8. 次に読む記事
  9. まとめ

setStateは、StatefulWidgetの中で値が変わったことをFlutterに伝えるためのメソッドです。初心者がFlutterの状態管理を理解する最初の一歩になります。

この記事の結論

setStateは「値を変える処理」と「画面を更新してほしい」という通知をまとめるために使います。小さな画面内の状態ならsetStateで十分です。

setStateの基本形

setState(() {
  count++;
});

ボタンで表示を更新する

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

  @override
  State<LikeButton> createState() => _LikeButtonState();
}

class _LikeButtonState extends State<LikeButton> {
  bool liked = false;

  @override
  Widget build(BuildContext context) {
    return IconButton(
      icon: Icon(liked ? Icons.favorite : Icons.favorite_border),
      onPressed: () {
        setState(() {
          liked = !liked;
        });
      },
    );
  }
}

非同期処理のあとに使う

API取得など非同期処理の後にsetStateする場合、Widgetがまだ画面にあるかを確認します。処理中に画面を閉じると、破棄後にsetStateしてエラーになることがあります。

Future<void> load() async {
  final result = await Future.delayed(
    const Duration(seconds: 1),
    () => "完了",
  );

  if (!mounted) return;

  setState(() {
    message = result;
  });
}

setStateで管理しすぎない

画面内だけで完結する小さな状態はsetStateで十分です。複数画面で共有する状態、APIキャッシュ、認証状態などはProviderやRiverpodへ分けると管理しやすくなります。

実装後に確認すること

  • setStateの中で状態を変更しているか
  • 非同期処理後にmountedを確認しているか
  • build内でsetStateを呼んでいないか
  • 共有状態までsetStateに詰め込んでいないか

よくあるつまずき

  • 値だけ変更してsetStateを忘れる
  • build中にsetStateして無限ループにする
  • 非同期処理後に破棄済みWidgetへsetStateする
  • 状態が増えすぎても1つのStateに置き続ける

次に読む記事

まとめ

setStateはFlutterの画面更新を理解する基本です。小さな状態から始め、非同期処理や共有状態が増えたら状態管理ライブラリへ進みましょう。