[Flutter] List<dynamic> is not a subtype of type List<String>エラー解決

[Flutter] List is not a subtype of type Listエラー解決

2023-09-05 hit count image

Flutterでhttpパッケージを使ってデータを取得してモデルクラスにデータを変更する際に発生するList is not a subtype of type Listエラーを解決する方法nついて説明します。

概要

FlutterAPI通信にhttpパッケージを使います。Flutterhttpパッケージを使ってAPIを呼び出す方法については、下記のリンクを参照してください。

Flutterで普通はhttpパッケージを使って取得したデータをモデルクラスに保存して使います。httpパッケージを使って取得したJSONデータをモデルクラスで保存する方法については下記の公式ドキュメントを参考してください。

今回のブログポストでは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']);
}

この時、FlutterJSONデータのタイプを正確に分かることができないので、JSON中の文字列リストデータをList<dynamic>として認識します。このList<dynamic>データをList<String>?に割り当てようにする時、次のようにList<dynamic> is not a subtype of type List<String>エラーが発生します。

Flutter - List<dynamic> is not a subtype of type List<String> error

エラー内容を見ると次のようになります。

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>?);

しかし、まだ次のようにエラーが発生することがが確認できます。

Flutter - List<dynamic> is not a subtype of type List<String> in type cast error

エラー内容だけ見ると次のようになります。

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 - Fix List<dynamic> is not a subtype of type List<String> error

完了

今回のブログポストではFlutterhttpを使って取得したデータをモデルクラスに変換する際に発生するList<dynamic> is not a subtype of type List<String>エラーを解決する方法について見てみました。皆さんもList<dynamic> is not a subtype of type List<String>エラーが発生したら、このブログポストを参考して解決してみてください。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

アプリ広報

今見てるブログを作成たDekuが開発したアプリを使ってみてください。
Dekuが開発したアプリはFlutterで開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。

Posts