今回は、Dartのリスト型で使用できる「.map」メソッドを用いて要素に変更を加え、別のリスト型を生成する「.toList」メソッドで生成されるリストのデータ型を指定する方法を解説します。
API通信などで取得してきた情報から自身で作成しているモデルクラスのインスタンスを生成し、それらを格納するリスト型の変数を作ろうとした際に、List<dynamic>型として認識され以下のようなエラーが発生します。
type 'List<dynamic>' is not a subtype of type 'List<User>'
こちらの解決方法をご紹介していきます。
コードサンプル
まずは今回のサンプルケースを紹介しておきます。
ユーザーの情報を管理するような「User」クラスを作成しておき、APIなどの通信結果で複数のユーザーのidを持ったデータを取得していると仮定します。
class User {
int id;
User({this.id});
}
class UserApi {
//本来はAPIなどから取得したデータを使用
List<dynamic> response = [1, 2, 3];
Future<List<User>> fetchUser() async{
List<User> userList = response.map((data) {
return User(id: data);
}).toList();
return userList;
}
}
上記コードを実行すると、以下のエラーが発生します。
type 'List<dynamic>' is not a subtype of type 'List<User>'
解決方法を紹介します。
toListメソッドで生成されるデータ型を指定する方法
コードサンプルの際に発生するエラーの解決方法を紹介します。
こちらは「.map」メソッドでreturnされるデータ型を指定することで解決することができます。
具体的なコードは以下です。
class User {
int id;
User({this.id});
}
class UserApi {
//本来はAPIなどから取得したデータを使用
List<dynamic> response = [1, 2, 3];
Future<List<User>> fetchUser() async{
List<User> userList = response.map<User>((data) {
return User(id: data);
}).toList();
return userList;
}
}
「.map」メソッドの後に「<User>」のようにデータ型を記述することで、こちらのメソッドで取得できる値のデータ型を指定することができます。
これが行われていないとデータ型が未指定となり「dynamic」型として解釈されてしまいます。
その結果、List<User>型で定義している変数に対して、List<dynamic>型の値が代入されることとなりエラーが発生していました。
おわりに
回は、Dartのリスト型で使用できる「.map」メソッドを用いて要素に変更を加え、別のリスト型を生成する「.toList」メソッドで生成されるリストのデータ型を指定する方法を解説させていただきました。
「.map<データ型>」こちらの記述方法を知っていれば問題なく対処できると思います。
ぜひ活用していきましょう。
当ブログではプログラミング学習に関する記事を執筆しております。他にもDartでの小数点の扱い方の記事などもあります。
ぜひ合わせてご覧ください。
最後まで読んでくださりありがとうございました。
コメント