FlutterでAPIからデータを取得してListに格納する際、「type 'List' is not a subtype of type 'List'」というエラーに遭遇することがあります。このエラーは、期待されるデータ型と実際に受け取ったデータ型が一致しない場合に発生します。本記事では、この問題の原因と解決方法について詳しく説明します。
エラーの原因
このエラーは主に、JSONデータをパースする際に発生します。Dartでは、JSONデコードの結果として`List`型が返されますが、コード内で`List`型を期待している場合にこのエラーが表示されます。
解決方法
1. キャスト(Cast)を使用する
最も簡単な解決方法は、受け取ったリストを明示的に`List`にキャストすることです。
```dart
List stringList = (jsonDecode(response.body) as List).cast();
```
2. map()メソッドを使用する
より安全な方法として、`map()`メソッドを使用してリストの各要素を明示的に`String`型に変換することができます。
```dart
List stringList = List.from(jsonDecode(response.body).map((item) => item.toString()));
```
3. 型チェックを行う
データの整合性を確保するために、各要素の型をチェックしてから変換するのが良いプラクティスです。
```dart
List stringList = (jsonDecode(response.body) as List)
.where((item) => item is String)
.map((item) => item as String)
.toList();
```
4. モデルクラスを使用する
大規模なプロジェクトでは、JSONデータをモデルクラスにマッピングすることをお勧めします。これにより、型の安全性が向上し、コードの可読性も高まります。
```dart
class MyModel {
final String name;
MyModel({required this.name});
factory MyModel.fromJson(Map json) {
return MyModel(name: json['name']);
}
}
List modelList = (jsonDecode(response.body) as List)
.map((item) => MyModel.fromJson(item))
.toList();
```
注意点
- APIのレスポンス形式が変更される可能性がある場合は、常にデータの型と構造を確認することが重要です。
- デバッグ時には`print()`文を使用してレスポンスの内容を確認し、期待通りのデータが返されているか確認しましょう。
まとめ
「type 'List' is not a subtype of type 'List'」エラーは、Flutterアプリ開発でよく遭遇する問題です。適切なキャストやマッピング、そしてモデルクラスの使用により、このエラーを効果的に解決できます。データの型安全性を確保することで、より堅牢なアプリケーションを開発することができます。