結論から
状況にもよりますが大半は以下のようなケースで当エラーが発生しているはずです。
修正前の例)
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key); //←ここでエラー
@override
_MyHomePageState createState() => new _MyHomePageState();
}
以下のように Keyの後ろに『?』をつけることで解消します。
修正後の例)
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key}) : super(key: key); //←Keyの後ろに『?』をつける
@override
_MyHomePageState createState() => new _MyHomePageState();
}
原因(ザックリ解説)
Flutter2のバージョンが上がり、Null safetyという文法が有効になったためです。
詳しい解説は他の記事に譲りますが、
ざっくりいうと
Nullを変数にセットするのは原則禁止にして以下のような
Nullを考慮した実装をしなければならなくなりました。
- 特別な修飾子(?・!・late・required)
- IF文でのNullチェック
- 演算子 ??でのNullチェック
などなど・・・
今回は修飾子「?」をKeyの後ろにつけることによって回避できました。
修飾子「?」 の意味は?
修飾子『?』の意味は
Nullを許可する
という意味です。
今回の例はKeyの後ろに『?』がついているので、
Keyで宣言した変数についてNullを許可する
ということです。
原因(詳細な解説)
更に詳しく解説すると
バージョンが上がったことにより
MyHomePageの継承元の『StatefulWidget』も「Null safety」の対応が行われました。
それに伴い、 StatefulWidget の引数は
Key から Key?
に変更になりました。
そのため、
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key); //←ここでエラー
@override
_MyHomePageState createState() => new _MyHomePageState();
}
で
MyHomePage({Key key}) : super(key: key);
としてしまうとKey?型の StatefulWidget にKey型を渡すことになります。
StatefulWidgetのKeyはデフォルトではnullになるという仕様です。
Key型はnullを許可していません。
つまり
- StatefulWidgetにNullを許可しないkeyを渡した
- StatefulWidgetのKeyはデフォルトではnull
となり、矛盾するため、以下のエラーがでます。
The parameter ‘key’ can’t have a value of ‘null’ because of its type, but the implicit default value is ‘null’.
(パラメータ「key」は、そのタイプのために「null」の値を持つことはできません。しかし、暗黙のデフォルト値は「null」です。)
Flutterあるある
公式サイトやブログのサンプルコピペしただけなのにエラーが出た!
っていう事象は大体この「Null safety」が悪さをしていることが多いです。
2021年5月20日以降から 「Dart 2.13」になり、「Null safety」が必ず効くようになったので、
それ以降のサンプルプログラムは動かない可能性があると思った方が良いです。
書籍購入の際も注意
そもそもFlutterは文法が変わってくと思われるので書籍を購入することはお勧めしません。
もし、購入するのであれば、新しいものを購入した方が良いです。
巻末の版数をみて2021年6月以降のものを対象に購入を検討することをお勧めします。
ちなみに以下の書籍は初版が2021年8月24日でNull Safetyに関する説明がありました。
(2ページ程度だけですが、スッキリまとまっていると思います。)