Flutterアプリ開発中に「Unhandled Exception: type 'String' is not a subtype of type 'int'」というエラーに遭遇した経験はありませんか?このエラーは、文字列型(String)のデータを整数型(int)として扱おうとした際に発生します。本記事では、このエラーの原因と解決方法について詳しく解説します。
エラーの原因
このエラーは主に以下の状況で発生します:
1. JSONデータの解析時に、数値フィールドが文字列として送信されている
2. テキスト入力フィールドから取得した値を直接整数として使用しようとしている
3. APIレスポンスで期待していた型と異なるデータ型が返ってきている
解決方法
1. 型変換を行う
最も一般的な解決策は、文字列を整数に変換することです。Dartでは`int.parse()`メソッドを使用できます。
String stringValue = "123";
int intValue = int.parse(stringValue);ただし、変換できない文字列の場合はエラーが発生するため、エラーハンドリングを考慮することをおすすめします。
String stringValue = "123";
int intValue;
try {
intValue = int.parse(stringValue);
} catch (e) {
print("変換できません: $e");
}2. null安全性を考慮する
Flutterのnull安全性を活用し、nullableな整数型を使用することで、より安全にデータを扱えます。
String? stringValue = "123";
int? intValue = int.tryParse(stringValue ?? "");`int.tryParse()`メソッドは変換できない場合にnullを返すため、エラーを避けつつ安全に変換できます。
3. JSONデコード時の型指定
JSONデータを扱う際は、デコード時に適切な型を指定することが重要です。
Map<String, dynamic> jsonData = jsonDecode(jsonString);
int value = jsonData['key'] as int;ただし、APIからの応答が予期せず文字列として返ってくる可能性もあるため、以下のように対応するのが安全です。
var rawValue = jsonData['key'];
int value = rawValue is int ? rawValue : int.parse(rawValue.toString());4. テキスト入力フィールドの値を扱う
テキスト入力フィールドから取得した値を整数として使用する場合は、以下のように対応します。
TextField(
onChanged: (value) {
int? intValue = int.tryParse(value);
if (intValue != null) {
// 整数値として使用
} else {
// エラーハンドリング
}
},
)まとめ
「type 'String' is not a subtype of type 'int'」エラーは、適切な型変換と型チェックを行うことで解決できます。特に、外部データを扱う際は常にデータ型の不一致に注意し、適切なエラーハンドリングを実装することが重要です。これらの対策を講じることで、より堅牢なFlutterアプリケーションを開発することができます。
Flutterでの開発をさらに効率化したい方は、IDEの活用やLintルールの設定など、開発環境の最適化も検討してみてください。エラーの早期発見と解決は、高品質なアプリ開発の鍵となります。