feat: update RecipesViewNotifier and RecipesScreen to use maybeWhen for safer state handling

This commit is contained in:
Nils-Johan Gynther
2026-04-25 07:12:36 +02:00
parent ba4e931f5c
commit 46de546f9f
3 changed files with 18 additions and 8 deletions
+5 -3
View File
@@ -105,11 +105,13 @@ class AppShell extends ConsumerWidget {
appBar: AppBar( appBar: AppBar(
title: Text(selectedDestination.title), title: Text(selectedDestination.title),
actions: [ actions: [
if (isRecipesRoute) ...existing code... if (isRecipesRoute)
Consumer( Consumer(
builder: (context, ref, child) { builder: (context, ref, child) {
final view = ref.watch(recipesViewProvider).valueOrNull ?? final view = ref.watch(recipesViewProvider).maybeWhen(
(mode: RecipesViewMode.grid, columns: 2); data: (v) => v,
orElse: () => (mode: RecipesViewMode.grid, columns: 2),
);
return Row( return Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
@@ -17,7 +17,10 @@ class RecipesViewNotifier extends AsyncNotifier<({RecipesViewMode mode, int colu
Future<void> toggleMode() async { Future<void> toggleMode() async {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
final current = state.valueOrNull ?? (mode: RecipesViewMode.grid, columns: 2); final current = state.maybeWhen(
data: (v) => v,
orElse: () => (mode: RecipesViewMode.grid, columns: 2),
);
final newMode = current.mode == RecipesViewMode.grid ? RecipesViewMode.list : RecipesViewMode.grid; final newMode = current.mode == RecipesViewMode.grid ? RecipesViewMode.list : RecipesViewMode.grid;
await prefs.setInt(_modeKey, newMode.index); await prefs.setInt(_modeKey, newMode.index);
state = AsyncData((mode: newMode, columns: current.columns)); state = AsyncData((mode: newMode, columns: current.columns));
@@ -25,7 +28,10 @@ class RecipesViewNotifier extends AsyncNotifier<({RecipesViewMode mode, int colu
Future<void> setColumns(int columns) async { Future<void> setColumns(int columns) async {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
final current = state.valueOrNull ?? (mode: RecipesViewMode.grid, columns: 2); final current = state.maybeWhen(
data: (v) => v,
orElse: () => (mode: RecipesViewMode.grid, columns: 2),
);
await prefs.setInt(_columnsKey, columns); await prefs.setInt(_columnsKey, columns);
state = AsyncData((mode: current.mode, columns: columns)); state = AsyncData((mode: current.mode, columns: columns));
} }
@@ -13,8 +13,10 @@ class RecipesScreen extends ConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final recipesAsync = ref.watch(recipesProvider); final recipesAsync = ref.watch(recipesProvider);
final view = ref.watch(recipesViewProvider).valueOrNull ?? final view = ref.watch(recipesViewProvider).maybeWhen(
(mode: RecipesViewMode.grid, columns: 2); data: (v) => v,
orElse: () => (mode: RecipesViewMode.grid, columns: 2),
);
return Stack( return Stack(
children: [ children: [
@@ -75,7 +77,7 @@ class RecipesScreen extends ConsumerWidget {
backgroundImage: NetworkImage(recipe.imageUrl!), backgroundImage: NetworkImage(recipe.imageUrl!),
) )
: const CircleAvatar(child: Icon(Icons.restaurant)), : const CircleAvatar(child: Icon(Icons.restaurant)),
title: Text(recipe.name), title: Text(recipe.title),
subtitle: Text(recipe.description ?? ''), subtitle: Text(recipe.description ?? ''),
onTap: () => context.push('/recipes/${recipe.id}'), onTap: () => context.push('/recipes/${recipe.id}'),
); );