前提・実現したいこと
flutterで家計簿アプリ(支出記録のみ)を作成しています
- 今回、アプリに登録した家計簿の内容を、sharedPreferencesを使用して、データ保存及び読み込みをしています。
- sharedPreferencesの使用時には、Jsonへのエンコード及びデコードを実行します。
sharedPreferencesに保存している内容
-
家計簿に登録するデータは、日時、費目、金額です。
-
例)
Dart
1 2//2020年4月1日の支出 日用品1000円、食費500円の場合 3//Map<String,List<Map<String,String>>>型 4{2020/4/1, [{費目:日用品,金額:1000},{費目:食費,金額:500}]} 5
今回やりたいこと
- sharedPreferencesからデータを読み込む際に、Jsonからデコードする。
- このとき、JsonにはMap{String,String}型で保存されているため、取り出した時もkey,valueともにStrirng型。
- このString型のデータを、読み込み時に、List<Map<String,Strign>>型に変換したい
現在sharedPreferencesのファイルには、
{ "2021年04月1日": "[{費目:日用品,金額:1000},{費目:食費,金額:500}]" }
という形で保存されています。
アプリ側で読み込む際は、そのままString型で読み込まれます。
こちらを、読み込み時にString型から
List<Map<String,Strig>>型の、
[{費目:日用品,金額:1000},{費目:食費,金額:500}]
という形に変換するよう実装したいです。
- 今のところ、デコード時に型変換をするライブラリや関数があるのではないかと考え、探しています。
- Google検索では「Json デコード 型変換」で調べましたが、ほしい情報に辿り着くことができませんでした。
どのように考えてみるとよいか、アドバイスをお願いいたします。
情報が不足している等についても、教えていただけるとありがたいです。
該当のソースコード
Dart
1class _CalenderState extends State<Calender> { 2 3 //支出の記録リスト 4 Map<DateTime, List<Map<String, String>>> dataList = {}; 5 6 // データの保存 7 Future _saveFile(BuildContext context) async { 8 SharedPreferences prefs = await SharedPreferences.getInstance(); 9 for( DateTime key in dataList.keys) { 10 String saveList = jsonEncode(dataList[key]); 11 prefs.setString(key.toString(), saveList); 12 } 13 } 14 15 // データの読み込み 16 Future _readFile(BuildContext context) async { 17 SharedPreferences prefs = await SharedPreferences.getInstance(); 18 setState(() { 19 20 //保存しているデータのKeyを、変数keyに入れて、forin文で回す 21 for( String key in prefs.getKeys()) { 22 23 //保存したデータのkeyをdecodeして、DateTime型にする 24 DateTime tempDataKeys = DateTime.parse(jsonDecode(jsonEncode(key))); 25 26 //保存したデータのvalueをdecodeして、List<Map<String,String>>型にしたい。 27 List<Map<String,String>> tempValueList =jsonDecode(jsonEncode(prefs.getString(key.toString()))); 28 } 29 }); 30 } 31 }
エラー
- 上記コードの場合、
Dart
1//保存したデータのvalueをdecodeして、List<Map<String,String>>型にしたい。 2 List<Map<String,String>> tempValueList =jsonDecode(jsonEncode(prefs.getString(key.toString())));
ここで、getStringメソッドを使用し、デコードを実行してます。
このため、「String型は、List<Map<String,String>>型のサブタイプではありません」というエラーが出ます。
試したこと
- List型で読み込みできればよいのでは、と考え、getStringメソッドをgetStringListメソッドに変更してみました。
しかしこの場合、変換後の型はList<String>型であり、変換したいList<Map<String,String>>型ではないため、上記と同様のエラーが出ました。
補足情報(FW/ツールのバージョンなど)
macBookPro
Flutter 1.22.5
Dart 2.10.4
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。