diff --git a/lib/pages/list_detail.dart b/lib/pages/list_detail.dart index f5cabbe..fa1690c 100644 --- a/lib/pages/list_detail.dart +++ b/lib/pages/list_detail.dart @@ -17,6 +17,7 @@ class ListDetailPage extends StatefulWidget { class _ListDetailPageState extends State { late Future> _itemsFuture; StreamSubscription? _itemsSubscription; + List _items = []; @override void initState() { @@ -34,7 +35,9 @@ class _ListDetailPageState extends State { } void _loadItems() { - setState(() => _itemsFuture = apiService.getItems(widget.list.id)); + setState(() { + _itemsFuture = apiService.getItems(widget.list.id); + }); } Future _showMembersDialog() async { @@ -72,10 +75,16 @@ class _ListDetailPageState extends State { ); if (ok != true || ctl.text.trim().isEmpty) return; + final String newName = ctl.text.trim(); + if (newName == item.name) return; + + final String oldName = item.name; + setState(() => item.name = newName); + try { - final String newName = ctl.text.trim(); await apiService.updateItem(item.id, name: newName); } catch (e) { + setState(() => item.name = oldName); if (mounted) { ScaffoldMessenger.of( context, @@ -84,7 +93,7 @@ class _ListDetailPageState extends State { } } - Future _addItem(List currentItems) async { + Future _addItem() async { final TextEditingController ctl = TextEditingController(); final bool? ok = await showDialog( context: context, @@ -110,7 +119,7 @@ class _ListDetailPageState extends State { if (ok != true || ctl.text.trim().isEmpty) return; try { - final int maxPos = currentItems.fold( + final int maxPos = _items.fold( -1, (max, item) => item.position > max ? item.position : max, ); @@ -125,28 +134,33 @@ class _ListDetailPageState extends State { } Future _deleteItem(Item item) async { + final int index = _items.indexOf(item); + setState(() => _items.remove(item)); + try { await apiService.deleteItem(item.id); if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('"${item.name}" gelöscht.')), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('"${item.name}" gelöscht.'))); } } catch (e) { + setState(() => _items.insert(index, item)); if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Fehler beim Löschen: $e')), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text('Fehler beim Löschen: $e'))); } } } Future _toggleItem(Item item) async { + final bool oldState = item.checked; setState(() => item.checked = !item.checked); try { await apiService.updateItem(item.id, checked: item.checked); } catch (e) { - setState(() => item.checked = !item.checked); + setState(() => item.checked = oldState); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text('Fehler beim Aktualisieren: $e')), @@ -178,17 +192,17 @@ class _ListDetailPageState extends State { return Center(child: Text('Fehler: ${snapshot.error}')); } - final List items = snapshot.data ?? []; + _items = snapshot.data ?? []; - if (items.isEmpty) { + if (_items.isEmpty) { return const Center( child: Text('Füge deinen ersten Eintrag hinzu!'), ); } return ListView.builder( - itemCount: items.length, + itemCount: _items.length, itemBuilder: (context, index) { - final Item item = items[index]; + final Item item = _items[index]; return ListTile( leading: Checkbox( value: item.checked, @@ -197,8 +211,9 @@ class _ListDetailPageState extends State { title: Text( item.name, style: TextStyle( - decoration: - item.checked ? TextDecoration.lineThrough : null, + decoration: item.checked + ? TextDecoration.lineThrough + : null, ), ), trailing: Row( @@ -220,10 +235,7 @@ class _ListDetailPageState extends State { }, ), floatingActionButton: FloatingActionButton( - onPressed: () async { - final currentItems = await _itemsFuture; - _addItem(currentItems); - }, + onPressed: _addItem, child: const Icon(Icons.add), ), ); diff --git a/pubspec.lock b/pubspec.lock index 2fd4d7b..d4dbce6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -172,10 +172,10 @@ packages: dependency: transitive description: name: meta - sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.16.0" nested: dependency: transitive description: @@ -393,10 +393,10 @@ packages: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.6" typed_data: dependency: transitive description: