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

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

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

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

Dart

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

Q&A

解決済

1回答

1807閲覧

shared_preferencesを利用して値の表示、保存をしたい

hiro.a

総合スコア28

Flutter

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

Dart

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

0グッド

0クリップ

投稿2020/09/21 09:43

前提・実現したいこと

Todoリストを作成しています。
shared_preferencesを使って入力された情報を保存し、起動時に表示させたい。

発生している問題・エラーメッセージ

①起動時に表示されているのは最後に入力された値のみ。

該当のソースコード

Flutter

1 2import 'package:flutter/foundation.dart'; 3import 'package:freezed_annotation/freezed_annotation.dart'; 4import 'package:state_notifier/state_notifier.dart'; 5import 'package:todo_app/todo.dart'; 6import 'package:uuid/uuid.dart'; 7import 'package:shared_preferences/shared_preferences.dart'; 8 9part 'todos_state.freezed.dart'; 10 11 12 13@freezed 14abstract class TodosState with _$TodosState { 15 const factory TodosState( {//TodosStateのクラスをチェック 16 @Default(<Todo>[]) List<Todo> todos,//すべてのTodoが入るtodos 17 }) = TodosStateData;//TodosStateDataであればデータの読み込みが終わったという判断ができるように 18 const factory TodosState.loading() = TodosStateLoading;//TodosStateLoadingであればまだ読み込み中 19} 20 21//ここからDB 22class TodosController extends StateNotifier<TodosState> with LocatorMixin { 23//LocatorMixinをmixinする事でcontextにあるproviderへのアクセスを容易する 24 TodosController() : super(const TodosState.loading()); 25 26 final _uuid = Uuid(); 27 28 @override 29 void initState() async { 30 super.initState(); 31 await Future<void>.delayed(const Duration(seconds: 3));//initStateで3秒間ウエイトを入れ,初期データとしていくつかのTodoをstateへ設定 32 // 初期データを設定、TodosStateLoadingからTodoStateDataへ変わるのでローディング完了の状態となる 33 34 var prefs = await SharedPreferences.getInstance(); 35 state = TodosState( 36 todos: [ 37 Todo(id: _uuid.v4(), title: 'テスト'), 38//保存した値を表示していく。 39 Todo(id: prefs.getString('_uuid.v4()') , title: prefs.getString('title') ), 40 Todo(id: prefs.getString('_uuid.v4()') , title: prefs.getString('title') ), 41 Todo(id: prefs.getString('_uuid.v4()') , title: prefs.getString('title') ), 42 ], 43 ); 44 } 45 46 void add(String title) async {//追加機能 47 final SharedPreferences prefs = await SharedPreferences.getInstance(); 48 final currentState = state; 49 if (currentState is TodosStateData) { 50 // todosのクローンに新しいTodoを追加してstateを更新 51 final todos = currentState.todos.toList() 52 ..add( 53 Todo(id: _uuid.v4(), title: title), 54 );//値の保存 55 prefs.setString('id',_uuid.v4()); 56 prefs.setString('title',title) ; 57 prefs.setString('id',_uuid.v4()); 58 prefs.setString('title',title) ; 59 state = currentState.copyWith(//stateはimmutableでメンバ変数を直接変更することはできないので、stateを更新するときは現在のstateからcopyWithでコピーするか、新規のstateで上書きする 60 todos: todos, 61 ); 62 63 } 64 } 65 66 67 68 void toggle(Todo todo) { 69 final currentState = state; 70 if (currentState is TodosStateData) { 71 // Todoを検索してcomplatedをtoggleし、stateを更新 72 final todos = currentState.todos.map((t) { 73 if (t == todo) { 74 return t.copyWith( 75 completed: !t.completed, 76 ); 77 } 78 return t; 79 }).toList(); 80 state = TodosState( 81 todos: todos, 82 ); 83 } 84 } 85}

試したこと

shared_preferences利用するたために別ファイルで作成し、のちに各ページで利用するメソッドも
考えましたがよく分からなくなったので、こちらに落ち着きました。

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

Flutter以前にDBを使う事が初心者です。情報不十分で申し訳ございませんが情報よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

起動時に表示されているのは最後に入力された値のみ

もしかすると、SharedPreferencesの挙動を勘違いされていませんか?

例えば、titleというキーに対してsetStringするたびに値が上書きされていくのは正しい挙動です。
なので、最後に入力した値だけが表示されるというのは自然かと思います。

dart

1Future<void> example() async { 2 final prefs = await SharedPreferences.getInstance(); 3 4 await prefs.setString('title', 'タイトル1'); 5 await prefs.setString('title', 'タイトル2'); 6 await prefs.setString('title', 'タイトル3'); 7 8 print(prefs.getString('title')); 9}

result

1タイトル3

もし複数のTodoをローカルに保存したいのであれば、sqfliteのようなデータベースを使うべきだと思います。

投稿2020/09/21 11:32

nskhei

総合スコア704

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

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

hiro.a

2020/09/21 11:45

回答ありがとうございます。ローカルで保存する方法を探していた中でsqfliteとSharedPreferencesを見つけ,SharedPreferencesの方が簡単そうなので、使ってみました。 sqfliteで試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問