毎日やることをリマインドするアプリを作る その2:タスクの保存

May 22, 2019

以下の記事の続きです。

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);
                      },

これでハリボテの状態は脱することができました。

次回以降も機能を追加して、よりアプリらしくしていきたいと思います。

ソースコードはこちらです。

https://github.com/tnantoka/nikka