feat: update RecipesViewNotifier and RecipesScreen to use maybeWhen for safer state handling
This commit is contained in:
@@ -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}'),
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user