..
押すだけタイマー をつくる(2)
リストにアイテムを追加してみよう。
まずは、追加ボタンを表示しよう。とりあえず、新規のPresetのIDは、固定で済ます。
preset_list_view.dart
floatingActionButton: FloatingActionButton(
onPressed: () {
Navigator.restorablePushNamed(
context,
PresetDetailsView.routeName,
arguments: {'itemid': 0},
);
},
child: const Icon(Icons.add),
),
詳細画面には、保存ボタンを追加する。
preset_details_view.dart
ElevatedButton(
onPressed: () {
controller.addPreset(preset);
Navigator.of(context).pop();
},
child: const Text('SAVE'),
),
最後に、コントローラーとサービスにもメソッドを追加する。
preset_controller.dart
Future<void> addPreset(Preset preset) async {
_list.add(preset);
await _presetService.add(preset);
}
preset_service.dart
Future<void> add(Preset preset) async {
_list.add(preset);
}
SAVEボタンを押してからホットリロードすると、リストに項目が追加されたことを確認できた。しかし、すでにある項目をタップして保存ボタンを押すと、新しく追加される。 「追加」しか実装していないので、当然か。
これはヒドいので、上書きにも対応しよう。
Presetのidが同一であれば同じものとして扱えばよいので、presetをListではなくidをキーとしたMapで保持する、という方針にした。 idをUUIDにすれば、新規項目用のid取得も簡単になる。
- Presetのプロパティidを、intからStringに変更する
- コントローラーとサービスのList
をMap<String, Preset>に変更する - addメソッドをupdateメソッドに名称変更、presetのidをキーにしてpresetを保存するように変更する
- 新規項目を取得できるよう、コントローラーに以下のメソッドを追加する(pubspec.yamlで、uuidパッケージを追加しておく)
Preset newPreset() { const uuid = Uuid(); return Preset(uuid.v4()); }
- PresetListViewで追加ボタンを押したときの動作は、コントローラーから上記メソッドで新規項目を取得し、そのidを渡すようにする
- PresetListViewでコントローラーからプロパティlistを参照している箇所を、listメソッドを呼び出すように変更する
- コントローラーには、listメソッドを追加しておく
List<Preset> list() { final List<Preset> _list = []; _presets.forEach((key, value) { _list.add(value); }); return _list; }
これで、同じidの項目が増え続けることはなくなった。