diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/pages/layout_detail.dart b/lib/pages/layout_detail.dart index b17ad35..944daaf 100644 --- a/lib/pages/layout_detail.dart +++ b/lib/pages/layout_detail.dart @@ -55,8 +55,17 @@ class _LayoutDetailPageState extends State { Future _refreshLayout() async { final updated = await apiService.getStoreLayoutById(_layout.id); - if (updated != null && mounted) { + if (!mounted) return; + if (updated != null) { setState(() => _layout = updated); + return; + } + + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Dieses Layout ist nicht mehr verfügbar.')), + ); + if (mounted) { + Navigator.of(context).pop(); } } diff --git a/lib/pages/list_detail.dart b/lib/pages/list_detail.dart index b6b37bf..383220c 100644 --- a/lib/pages/list_detail.dart +++ b/lib/pages/list_detail.dart @@ -627,12 +627,11 @@ class _ListDetailPageState extends State { ).showSnackBar(SnackBar(content: Text('"${item.name}" gelöscht.'))); } } catch (e) { + if (!mounted) return; 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'))); } } @@ -642,12 +641,11 @@ class _ListDetailPageState extends State { try { await apiService.updateItem(item.id, checked: item.checked); } catch (e) { + if (!mounted) return; setState(() => item.checked = oldState); - if (mounted) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Fehler beim Aktualisieren: $e')), - ); - } + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Fehler beim Aktualisieren: $e')), + ); } } diff --git a/lib/pages/login.dart b/lib/pages/login.dart index 784b072..f913356 100644 --- a/lib/pages/login.dart +++ b/lib/pages/login.dart @@ -30,7 +30,9 @@ class _LoginPageState extends State { await apiService.login(email, password); } } catch (e) { - setState(() => _error = e.toString()); + if (mounted) { + setState(() => _error = e.toString()); + } } finally { if (mounted) { setState(() => _loading = false); @@ -38,6 +40,13 @@ class _LoginPageState extends State { } } + @override + void dispose() { + _emailCtl.dispose(); + _pwCtl.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Scaffold( diff --git a/lib/widgets/members_dialog.dart b/lib/widgets/members_dialog.dart index 49fc3d9..2336855 100644 --- a/lib/widgets/members_dialog.dart +++ b/lib/widgets/members_dialog.dart @@ -80,16 +80,22 @@ class _MembersDialogState extends State { final List newMembers = [...widget.list.members, user.id]; await apiService.updateList(widget.list.id, members: newMembers); - setState(() { - widget.list.members = newMembers; - _userEmails[user.id] = user.data['email'] as String; - _emailCtl.clear(); - _hasChanges = true; - }); + if (mounted) { + setState(() { + widget.list.members = newMembers; + _userEmails[user.id] = user.data['email'] as String; + _emailCtl.clear(); + _hasChanges = true; + }); + } } catch (e) { - setState(() => _error = e.toString()); + if (mounted) { + setState(() => _error = e.toString()); + } } finally { - setState(() => _isLoading = false); + if (mounted) { + setState(() => _isLoading = false); + } } } @@ -128,17 +134,29 @@ class _MembersDialogState extends State { .toList(); await apiService.updateList(widget.list.id, members: newMembers); - setState(() { - widget.list.members = newMembers; - _hasChanges = true; - }); + if (mounted) { + setState(() { + widget.list.members = newMembers; + _hasChanges = true; + }); + } } catch (e) { - setState(() => _error = e.toString()); + if (mounted) { + setState(() => _error = e.toString()); + } } finally { - setState(() => _isLoading = false); + if (mounted) { + setState(() => _isLoading = false); + } } } + @override + void dispose() { + _emailCtl.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { final bool isOwner = widget.list.owner == apiService.userId; diff --git a/pubspec.lock b/pubspec.lock index d4dbce6..2fd4d7b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -172,10 +172,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.0" nested: dependency: transitive description: @@ -393,10 +393,10 @@ packages: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.dev" source: hosted - version: "0.7.6" + version: "0.7.7" typed_data: dependency: transitive description: