Flutterの質問

finalとconstの違いがよく分からない

質問日時

2021年05月13日

a-sato

再代入が不可能な変数定義の修飾子finalとconstの違いがよく分かりません。 constの方はコンパイル時に値が確定するとのことですが、実際にそういった差異をどのように使い分けるのでしょうか?

ベストアンサー

2021年05月18日

t-kobayashi

constはコンパイル時に代入される変数(定数なのに変数というのは不思議ですが、コンパイル時に代入されているので定義はやはり変数になります)。例えば円周率const double pi = 3.14;のように、プログラムを起動する前から、プログラムが終了するまで、変わることのない変数を定義する場合は、constを使います。

一方、finalはランタイム中に一度だけ代入できる変数の前に付けます。典型的な話としては、StatelessWidgetはランタイム中に作成されますが、作成後はランタイム終了まで変更されまないということが前提なので、StatelessWidgetの中で定義される変数はすべてfinalにする必要があります。

例えば、ボタンを表示するStatelessWidgetがあるとします。

class SampleButton extends StatelessWidget {
    final String title;
    SampleButton({this.title});

    @override
    Widget build(BuildContext context) {
        return RaisedButton(
            onPressed: () => {
                // 
            },
            child: Text(
               title,
            ),
        );
    }
}

このSampleButtonはStatelessWidgetのなので、作成後は変化しませんが、titleはランタイムにならないとわかりません。なので、constではなくてfinalにする必要があります。

質問に回答する

1件の回答

ベストアンサー

2021年05月18日

t-kobayashi

constはコンパイル時に代入される変数(定数なのに変数というのは不思議ですが、コンパイル時に代入されているので定義はやはり変数になります)。例えば円周率const double pi = 3.14;のように、プログラムを起動する前から、プログラムが終了するまで、変わることのない変数を定義する場合は、constを使います。

一方、finalはランタイム中に一度だけ代入できる変数の前に付けます。典型的な話としては、StatelessWidgetはランタイム中に作成されますが、作成後はランタイム終了まで変更されまないということが前提なので、StatelessWidgetの中で定義される変数はすべてfinalにする必要があります。

例えば、ボタンを表示するStatelessWidgetがあるとします。

class SampleButton extends StatelessWidget {
    final String title;
    SampleButton({this.title});

    @override
    Widget build(BuildContext context) {
        return RaisedButton(
            onPressed: () => {
                // 
            },
            child: Text(
               title,
            ),
        );
    }
}

このSampleButtonはStatelessWidgetのなので、作成後は変化しませんが、titleはランタイムにならないとわかりません。なので、constではなくてfinalにする必要があります。

関連した質問

soichiro1210 が1年前に投稿

質問日時 2023年07月31日

a-sato が3年前に投稿

質問日時 2021年07月01日

a-sato が3年前に投稿

質問日時 2021年06月30日

takumi が3年前に投稿

質問日時 2021年05月20日

a-sato が3年前に投稿

質問日時 2021年05月14日

Flutterの質問一覧を見る

Flutterの記事

Flutterの記事一覧を見る
search