前提・実現したいこと
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を使う事が初心者です。情報不十分で申し訳ございませんが情報よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/21 11:45