前提・実現したいこと
SharedPreferencesでローカルで保存したいのですが、保存できるのが最後に入力した文字のみで
入力した文字全て保存されてない
発生している問題・エラーメッセージ
最後に入力した文字しか保存されていない!
該当のソースコード
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 9// import 'package:cloud_firestore/cloud_firestore.dart'; //cloud_firestoreのインポート 10 11part 'todos_state.freezed.dart'; 12 13//ローディング中を示す 14@freezed 15abstract class TodosState with _$TodosState { 16 const factory TodosState( {//TodosStateのクラスをチェック 17 @Default(<Todo>[]) List<Todo> todos,//すべてのTodoが入るtodos 18 }) = TodosStateData;//TodosStateDataであればデータの読み込みが終わったという判断ができるように 19 const factory TodosState.loading() = TodosStateLoading;//TodosStateLoadingであればまだ読み込み中 20} 21 22//ここにDB 23class TodosController extends StateNotifier<TodosState> with LocatorMixin { //LocatorMixinをmixinする事でcontextにあるproviderへのアクセスを容易する 24 TodosController() : super(const TodosState.loading()); 25 final _uuid = Uuid(); 26 @override 27 void initState() async { 28 super.initState(); 29 await Future<void>.delayed(const Duration(seconds: 3));//initStateで3秒間ウエイトを入れ,初期データとしていくつかのTodoをstateへ設定 30 // 初期データを設定、TodosStateLoadingからTodoStateDataへ変わるのでローディング完了の状態となる 31 32 var prefs = await SharedPreferences.getInstance(); 33 state = TodosState( 34 todos: [ 35 // Todo(id: _uuid.v4(), title: 'テスト'), 36 Todo(id: prefs.getString('_uuid.v4()') , title: prefs.getString('title') ),//書き込む 37 ], 38 ); 39 } 40 41 void add(String title) async {//追加機能 42 final SharedPreferences prefs = await SharedPreferences.getInstance(); 43 final currentState = state; 44 if (currentState is TodosStateData) { 45 // todosのクローンに新しいTodoを追加してstateを更新 46 final todos = currentState.todos.toList() 47 ..add( 48 Todo(id: _uuid.v4(), title: title), 49 ); 50 prefs.setString('id',_uuid.v4());//読み込み 51 prefs.setString('title',title) ; 52 state = currentState.copyWith(//stateはimmutableでメンバ変数を直接変更することはできないので、stateを更新するときは現在のstateからcopyWithでコピーするか、新規のstateで上書きする 53 todos: todos, 54 ); 55 56 } 57 } 58 59 void toggle(Todo todo) { 60 final currentState = state; 61 if (currentState is TodosStateData) { 62 // Todoを検索してcomplatedをtoggleし、stateを更新 63 final todos = currentState.todos.map((t) { 64 if (t == todo) { 65 return t.copyWith( 66 completed: !t.completed, 67 ); 68 } 69 return t; 70 }).toList(); 71 state = TodosState( 72 todos: todos, 73 ); 74 } 75 } 76}
試したこと
補足情報(FW/ツールのバージョンなど)
SQLiteが理解できずにこちらを使うようにしました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/01 06:48
2020/11/01 06:49
2020/11/01 08:23