こんにちは、株式会社ダイアログでFlutterエンジニア2年目のエンジニアです。
Flutterで開発を始めたばかりの頃、const
って正直「なんか付けとけばいいや」くらいの感覚で使っていませんでしたか?
この記事では、
- Flutterの
const
が何をしているのか? - なぜ使うことでパフォーマンスが上がるのか?
をわかりやすく解説します。
✅ 結論! :constは「インスタンスを再利用する」ための宣言
Flutterのconst
は、同じ構造のWidgetを再利用できるようにするための仕組みです。
const Text('Hello');
このように書くと、「これはコンパイル時に定数として確定するから、再利用できる」とFlutterは認識します。
※コンパイル時定数:プログラムのコンパイル時にすでに値が決まっているconst修飾子がついた定数。
※実行時定数:プログラムの実行中に決まるfinal修飾子がついた定数。
💡 constを使うことで得られる2つのメリット
1. Widgetの再生成を防ぐ
以下のコードを見てください:
// constあり
body: const Text('Hello');
// constなし
body: Text('Hello');
constがない場合、build()
メソッドが呼ばれるたびに Text('Hello')
のインスタンスが毎回新しく生成されます。
これはパフォーマンスに悪影響を及ぼします。
一方、const
を使うとFlutterは:
「このウィジェット、前にも全く同じのがあったから再利用していいね!」
と判断し、無駄な再生成を防ぐことができます。
2. Elementの再利用がしやすくなる
FlutterのUIは、以下の3層のオブジェクトで構成されています:
- Widget(設計図)
- Element(ウィジェットのインスタンス)
- RenderObject(実際に画面上に描画されるオブジェクト)
FlutterはWidgetの構造を比較し、「変更があったかどうか」を判断します。
const
ウィジェットは 「絶対に変更されない」 ことが保証されているため、Flutterはそれを再利用できます。
その結果:
- ✅ Elementの差分判定(再描画するか否か)が高速に
- ✅ 不要な再構築を防止
- ✅ スクロールやアニメーション中のパフォーマンスも向上
というメリットにつながります。
🔎 buildが何度も呼ばれる理由とconstの関係
Flutterでは、setState()
や Provider
などの変更通知によって、build()
が何度も呼ばれます。
しかし、毎回 Widget を新しく作っていたら パフォーマンスが落ちてしまいます。
そのため、const
で再利用可能な Widget を定義しておくことが重要です。
例:const
がないと…
Widget build(BuildContext context) {
return Column(
children: [
Text('Hello'), // 毎回新しいインスタンス
],
);
}
例:const
があると…
Widget build(BuildContext context) {
return Column(
children: const [
Text('Hello'), // インスタンスの再利用が可能
],
);
}
⚠️ 注意:constは万能ではない
const
は便利ですが、すべてのケースで使えるわけではありません。
-
動的に変わる値 を使いたいときは
const
にできません。 - 状態を持つウィジェット(
StatefulWidget
)で 変更される内部のデータ がある場合も、const
の使用は制限されます。
🔚 まとめ
-
const
を使うと、Widgetの再生成を防ぎ、Elementの再利用が可能になる - Flutterアプリのパフォーマンス向上に直結する
- 意図を明示でき、コードの可読性・保守性もアップ
👉 使えるところには 積極的に const
を使っていこう!