11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Flutter】This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final~の対処法

Last updated at Posted at 2020-09-18

Flutter学習での先日のエラー。

##症状

This class (or a class that this class inherits from) is marked as '@immutable', but one or more of its instance fields aren't final: HomePage.cameras

このクラスはimmutableなクラスであるのに、final修飾子がないフィールド(メンバ変数)があるよと言っています。

immutable(イミュータブル)とは

immutable(イミュータブル)とは、直訳で「不変」「変わらない」という意味。
プログラム的に言えば、作成後のオブジェクトの状態を変えちゃダメってこと。

StatelessWidget、StatefulWidegetを拡張するクラスではイミュータブルでなくてはなりません。

対処法:finalをつける

イミュータブルであることを明示するためにも、**StatelessWidget、StatefulWidegetを拡張するクラスのすべてのフィールドはfinalである必要があります。**ってよく見たら、警告でも言っていますね。

final修飾子をつけると、宣言後に値の変更をすることができません(説明不要かと思いますが念のため)。

ひとつfinal修飾子が抜けていたので修正すると無事解決。

修正前
class HomePage extends StatefulWidget {
  final Color pannelColor;
  final String title;
  List<CameraDescription> cameras;

  HomePage({
    @required this.pannelColor,
    @required this.title,
    @required this.cameras,
  });
修正後
class HomePage extends StatefulWidget {
  final Color pannelColor;
  final String title;
  final List<CameraDescription> cameras; // finalを付加

  HomePage({
    @required this.pannelColor,
    @required this.title,
    @required this.cameras,
  });

そのほかの対処法

とにかく警告を削除したければ、クラス定義の頭に// ignore: must_be_immutableを追記してください。

参考

https://stackoverflow.com/questions/54707731/this-class-inherits-from-a-class-marked-as-immutable-and-therefore-should-be-i

11
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?