dart

A value of type ‘String?’ can’t be assigned to a variable of type ‘String’エラーについて

結論

状況によったり他の方法もありますが、

方法の1つとして以下のように型定義の後ろに?をつけることで解消します。
例えば、有名どころの(知らなかったらすみません。。)
SharedPreferences を使った場合の例でのエラーだと

修正前)

SharedPreferences.getInstance().then(
        (SharedPreferences prefs) {
          String str_test = prefs.getString('test');←ここでエラー
    }
);

修正後)

SharedPreferences.getInstance().then(
        (SharedPreferences prefs) {
          String? str_test = prefs.getString('test');←Stringの後ろに?をつける
    }
);

とすればエラーが解消されます。

原因(ザックリ解説)

バージョンを上げたことが原因です。

Flutter2にバージョンを上げると

Null safetyという文法が有効になります。

詳しい解説は他の記事に譲りますが、

ざっくりいうと

Nullを変数にセットするのは原則禁止にして以下のような
Nullを考慮した実装をしなければならなくなりました。

  • 特別な修飾子(?・!・late・required)
  • IF文でのNullチェック
  • 演算子 ??でのNullチェック

などなど・・・

今回は修飾子「?」をString型の後ろにつけることによって回避できました。

原因(詳細な解説)

更に詳しく解説すると

バージョンが上がったことにより

SharedPreferencesも「Null safety」の対応が行われました。

それに伴い、SharedPreferences.getStringの戻り値は

String から String?

に変更になりました。

そのため、

String str_test = prefs.getString(‘test’);

を使用とするとString?の戻り値をStringの変数にセットする形になるので

A value of type ‘String?’ can’t be assigned to a variable of type ‘String’
(type「文字列?」の値 type「文字列」の変数に割り当てることはできません)

というエラーが表示されることになります。

Flutterあるある

公式サイトやブログのサンプルコピペしただけなのにエラーが出た!

っていう事象は大体この「Null safety」が悪さをしていることが多いです。

2021年5月20日以降から 「Dart 2.13」になり、「Null safety」が必ず効くようになったので、

それ以降のサンプルプログラムは動かない可能性があると思った方が良いです。

書籍購入の際も注意

そもそもFlutterは文法が変わってくと思われるので書籍を購入することはお勧めしません。

もし、購入するのであれば、新しいものを購入した方が良いです。

巻末の版数をみて2021年6月以降のものを対象に購入を検討することをお勧めします。

ちなみに以下の書籍は初版が2021年8月24日でNull Safetyに関する説明がありました。
(2ページ程度だけですが、スッキリまとまっていると思います。)