以下の記事の続きです。
今回はタスクのデータを保存できるようにします。
まずは、JSONとの変換処理を書きます。
Task.fromJson(Map<String, dynamic> json) { name = json['name']; final List<dynamic> decodedHistory = json['_histories']; _histories = decodedHistory.cast<int>(); } Map<String, dynamic> toJson() => <String, dynamic>{ 'name': name, '_histories': _histories, };
Documentsディレクトリにtasks.json
というファイルを作って保存することにします。
ディレクトリの取得はpath_provider
という公式プラグインを使います。
static Future<File> _localFile() async { final String path = (await getApplicationDocumentsDirectory()).path; return File('$path/tasks.json'); } static Future<void> save(List<Task> tasks) async { final File file = await _localFile(); file.writeAsString(json.encode(tasks)); } static Future<List<Task>> load() async { final File file = await _localFile(); if (file.existsSync()) { final List<dynamic> decoded = json.decode(await file.readAsString()); return decoded.map((dynamic json) => Task.fromJson(json)).toList(); } else { return <Task>[]; } }
現状、以下のように、タスクを操作した時に都度save
を呼ぶことで保存しています。
onPressed: () { setState(() { task.toggleToday(); }); Task.save(_tasks); },
これでハリボテの状態は脱することができました。
次回以降も機能を追加して、よりアプリらしくしていきたいと思います。
ソースコードはこちらです。