概要
Flutter
でAPI
通信にhttp
パッケージを使います。Flutter
でhttp
パッケージを使ってAPI
を呼び出す方法については、下記のリンクを参照してください。
Flutter
で普通はhttp
パッケージを使って取得したデータをモデルクラスに保存して使います。http
パッケージを使って取得したJSON
データをモデルクラスで保存する方法については下記の公式ドキュメントを参考してください。
- 公式ドキュメント: Serializing JSON inside model classes
今回のブログポストではhttp
パッケージでデータを取得して、モデルクラスに変更する際にたまに発生するList<dynamic> is not a subtype of type List<String>
エラーを解決する方法について説明します。
タイプ変換エラー
http
パッケージを使って取得したデータをモデルクラスに変更する時、下記のようにfromJson
メソッドを使います。
class ExampleModel {
final List<String>? list;
ExampleModel({this.list});
factory ExampleModel.fromJson(Map<String, dynamic> json) =>
ExampleModel(list: json['list']);
}
この時、Flutter
はJSON
データのタイプを正確に分かることができないので、JSON
中の文字列リストデータをList<dynamic>
として認識します。このList<dynamic>
データをList<String>?
に割り当てようにする時、次のようにList<dynamic> is not a subtype of type List<String>
エラーが発生します。

エラー内容を見ると次のようになります。
Exception has occurred.
_TypeError (type 'List<dynamic>' is not a subtype of type 'List<String>?')
解決方法
この問題を解決するためにはデータのタイプをList<dynamic>
からList<String>?
に変換する必要があります。普通タイプ変換をするために次のように修正することがあります。
factory ExampleModel.fromJson(Map<String, dynamic> json) =>
ExampleModel(list: json['list'] as List<String>?);
しかし、まだ次のようにエラーが発生することがが確認できます。

エラー内容だけ見ると次のようになります。
Exception has occurred.
_TypeError (type 'List<dynamic>' is not a subtype of type 'List<String>? in type cast')
これを修正するためには次のようにList<String>?
で変換する必要があります。
factory ExampleModel.fromJson(Map<String, dynamic> json) => ExampleModel(
list: (json['list'] as List?).map((item) => item as String).toList());
このように修正すると次のように問題が解決されることが確認できます。 이렇게 수정하면 다음과 같이 문제가 해결되는 것을 확인할 수 있습니다.

完了
今回のブログポストではFlutter
でhttp
を使って取得したデータをモデルクラスに変換する際に発生するList<dynamic> is not a subtype of type List<String>
エラーを解決する方法について見てみました。皆さんもList<dynamic> is not a subtype of type List<String>
エラーが発生したら、このブログポストを参考して解決してみてください。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。