質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

332閲覧

SharedPreferencesで保存したのとは違う値を読み込んでしまう

j06110611

総合スコア54

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2023/03/16 04:07

編集2023/03/16 04:50

実現したいこと

文字列を保存して読み込みたい

前提

日記アプリを作っていて、日記を追加したら、その内容・日付・時間なんかをそれぞれSharedPreferencesで保存してます。
今はアプリを閉じてまた開いたとき、日記の内容を読み込ませたいです。
保存は多分上手くできてるのですが読み込む際に違う値が入ってしまいます。

該当のソースコード

Main.Dartの抜粋

Dart

1 2 void initState() { 3 super.initState(); 4 5 Future(() async { 6 await rm.madeDiaryOrNot(); 7 await rm.readDiary(); 8 await rm.readDate(); 9 await rm.readTime(); 10 11 setState(() { 12 for (int i = 0; i < diaryList.length; i++) { 13 items.add(diaryList.elementAt(i) + '\n' + translatedList.elementAt(i)); 14 print(diaryList.elementAt(i)); 15 } 16 }); 17 }); 18 } 19

SaveAndGet.Dartの抜粋

Dart

1Future<void> save(String inputtext,String date,String time) async{ 2 final SharedPreferences diaryPrefs = await _diaryPrefs; 3 final SharedPreferences counterPrefs = await _counterPrefs; 4 final SharedPreferences datePrefs = await _datePrefs; 5 final SharedPreferences timePrefs = await _timePrefs; 6 await diaryPrefs.setString(counter.toString(), inputtext); 7 print(inputtext); 8 await counterPrefs.setInt('counter',counter); 9 await datePrefs.setString(counter.toString(), date); 10 await timePrefs.setString(counter.toString(), time); 11 } 12 13 Future<List> getDiaryPref() async { 14 SharedPreferences diaryPrefs = await SharedPreferences.getInstance(); 15 List<String> list = []; 16 for(int i = 1; i <= counter; i++) { 17 list.add(diaryPrefs.getString(i.toString()) ?? 'nothing'); 18 print(diaryPrefs.getString(i.toString())); 19 } 20 return list; 21 } 22 23 Future<List> getTimePref() async { 24 SharedPreferences timePrefs = await SharedPreferences.getInstance(); 25 List<String> list = []; 26 for(int i = 1; i <= counter; i++) { 27 list.add(timePrefs.getString(i.toString()) ?? 'nothing'); 28 } 29 return list; 30 }

試したこと

デバッグして変数の値を調べました。inputtextをdiaryPrefsに保存したはずなので読み込んだ際に"原因がわからない"が入っててほしいのですが、なぜかtimePrefsで保存したであろうtimeが出てきています。
↓保存するところイメージ説明
↓読み込み
イメージ説明
↓結果
イメージ説明

上の写真とは違いますが、timeを保存するところ(SaveAndGet.DartのL10)をコメント化してみたら、多分datePrefsで保存されたであろう日付がListViewに表示されました。

補足情報(FW/ツールのバージョンなど)

shared_preferences: ^2.0.13

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SharedPreferencesはキーと値をペアで管理し、同一キーに複数のデータを格納できません。
同一キーに値を設定した場合、後に設定したもので上書きされます。

提示された実装ではcounter.toString()で文字化したキーにinputtext, date, timeを順に設定しており、たぶん最後のtimeだけが実際に設定されたものになっているのではと思います。

一応、設定する先としてdiaryPrefsなど変数名を変えているようですが、その保存先は同一個所で異なる場所に保存されるということはありません。

今回のケースとしては、キーを例えばcounterを文字列化したものの後ろにinputtext, date, timeの文字名称を付けて異なるキーにするか、inputtext, date, timeを合成した文字列、例えばJSON化などして、それを設定するという実装が望ましいと思います。

投稿2023/03/16 10:17

ta.fu

総合スコア1667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

j06110611

2023/03/16 12:03

解決しましたありがとうございます!少し初歩的なミスでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問