一昨日から対応している「pedantic_mono」(Lint)」対応。
昨日までの対応でひとまずLintエラーになっている所の修正は一通り完了したものの、何故かアプリ実行時エラーが出ていました。
JSONのデコード周りであろうことはわかっていたのですが、修正出来なかったので、頭を冷やして今日もう一度最初から少しずつ動作確認しながらやると、うまくエラー対応を完了させることができました。
デバッグ版・リリース版 x iOS・Androidで動作確認する限り、正しく動いているっぽいのでよさそうです。
ワーニングはまだ大量に出ておりますがこちらもボチボチ対応していく予定です。
そして、今回の対応で最後までよくわからなかったのが、jsonDecode関数のよってJSONデータをDartデータに変換する処理です。
結局、以下の通り、愚直にやるととりあえずうまくいきましたが、どう見ても冗長でうまくありません。
アプリ開発していれば、こんなケースは頻出中の頻出だと思うのですが、ググってもイマイチ定番の書き方がわかりませんでした。。
ぜひ、Flutter歴長い方にサンプルコードをご提示いただきたいところです(切実)。
import 'dart:convert';
test('jsonDecode', () {
// ここからJSONデータ
const json = '''
{
"properties": {
"genres": {
"id": ":NbD",
"type": "multi_select",
"multi_select": {
"options": [
{
"id": "a1883558-276c-4094-a720-b895694a9271",
"name": "異世界転生",
"color": "brown"
}
]
}
}
}
// ここまでJSONデータ
}
''';
// ここからJSONデータをDartデータにデコードする処理
// JSONのネストを1段ずつcastしながら取得していく。
final parsedJson = jsonDecode(json) as Map<String, dynamic>;
debugPrint('parseJson:${parsedJson.runtimeType}'); //"_InternalLinkedHashMap<String, dynamic>
"になる。これは何?
debugPrint(parsedJson.toString());
// properties
final properties = parsedJson['properties'] as Map<String, dynamic>;
debugPrint('properties:${properties.runtimeType}');
debugPrint(properties.toString());
// genres
final genres = properties['genres'] as Map<String, dynamic>;
debugPrint('genres:${genres.runtimeType}');
debugPrint(genres.toString());
// multi_select
final multiSelect = genres['multi_select'] as Map<String, dynamic>;
debugPrint('multi_select:${multiSelect.runtimeType}');
debugPrint(multiSelect.toString());
// options
final options = multiSelect['options'] as List<dynamic>;
debugPrint('options:${options.runtimeType}');
debugPrint(options.toString());
// List<dynamics> -> List<Map<String, dynamics>>へのcast
final genreOptions =
options.map((dynamic e) => e as Map<String, dynamic>).toList();
debugPrint('genreOptions:${genreOptions.runtimeType}');
debugPrint(genreOptions.toString());
// option[0]
final genreOption = genreOptions[0];
debugPrint('genreOption:${genreOption.runtimeType}');
debugPrint(genreOption.toString());
// ここまでやってようやくid, name, color(String)が取得できる。
debugPrint('genreOption.id:${(genreOption['id'] as String).runtimeType}');
debugPrint(
'genreOption.name:${(genreOption['name'] as String).runtimeType}');
debugPrint(
'genreOption.color:${(genreOption['color'] as String).runtimeType}');
// ここまでJSONデータをDartデータにデコードする処理
});
区切りとして、「pedantic_mono」(Lint)」対応版を「軽微な不具合対応」として、近々バージョンアップリリースしようと思います。
コメント