以下の記事の続きです。
https://flutter.tnantoka.com/entry/2019/05/18/215048
今回はタスクのデータを保存できるようにします。
まずは、JSONとの変換処理を書きます。
1
2
3
4
5
6
7
8
9
10
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
という公式プラグインを使います。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
を呼ぶことで保存しています。
1
2
3
4
5
6
onPressed: () {
setState(() {
task.toggleToday();
});
Task.save(_tasks);
},
これでハリボテの状態は脱することができました。
次回以降も機能を追加して、よりアプリらしくしていきたいと思います。
ソースコードはこちらです。