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ルールの設定など、開発環境の最適化も検討してみてください。エラーの早期発見と解決は、高品質なアプリ開発の鍵となります。