Flutterアプリ開発中に「Unhandled Exception: type 'String' is not a subtype of type 'num' in type cast」というエラーに遭遇した経験はありませんか?このエラーは、文字列(String)を数値(num)に変換しようとした際によく発生します。本記事では、このエラーの原因と解決方法について詳しく解説します。

エラーの原因

このエラーは主に、JSONデータを解析する際や、テキスト入力フィールドから取得した値を数値として扱おうとした時に発生します。Dartは静的型付け言語であるため、String型をnum型(intやdoubleの親クラス)に自動的に変換することはできません。

解決方法

1. parse()メソッドの使用

最も一般的な解決方法は、`int.parse()`または`double.parse()`メソッドを使用することです。

```dart

String numberString = "123";

int number = int.parse(numberString);

```

または

```dart

String numberString = "123.45";

double number = double.parse(numberString);

```

2. tryParse()メソッドの使用

`parse()`メソッドは変換できない文字列に対して例外をスローしますが、`tryParse()`は変換できない場合にnullを返します。

```dart

String numberString = "123";

int? number = int.tryParse(numberString);

```

3. 条件分岐の使用

JSONデータを扱う際は、値の型が不確定な場合があります。そのような場合は、条件分岐を使用して適切に処理します。

```dart

dynamic value = json['someKey'];

num number;

if (value is num) {

number = value;

} else if (value is String) {

number = num.tryParse(value) ?? 0; // デフォルト値を設定

} else {

number = 0; // デフォルト値を設定

}

```

4. null安全性の考慮

Null安全性が有効な場合、nullableな型を使用することで、より安全にデータを扱うことができます。

```dart

String? numberString = someFunction();

num? number = numberString != null ? num.tryParse(numberString) : null;

```

予防策

  • 可能な限り、APIやデータソースからの数値データは数値型で受け取るようにしましょう。
  • ユーザー入力を扱う際は、入力値のバリデーションを行い、数値のみを受け付けるようにしましょう。
  • JSONデータを扱う際は、スキーマを明確にし、型の不一致が起こりにくいようにデータ構造を設計しましょう。

まとめ

「type 'String' is not a subtype of type 'num' in type cast」エラーは、適切な型変換を行うことで解決できます。`parse()`や`tryParse()`メソッドを使用し、必要に応じて条件分岐を行うことが重要です。また、アプリケーションの設計段階から型の一貫性を意識することで、このようなエラーを未然に防ぐことができます。

Flutterでの開発をスムーズに進めるためには、Dartの型システムをよく理解し、適切なデータ処理を心がけることが大切です。エラーに遭遇した際は、慌てずにエラーメッセージを読み解き、適切な対処を行いましょう。