From f8fc9947982f6dfbb4823d75cd202876077fae3c Mon Sep 17 00:00:00 2001 From: Piyush Date: Sat, 16 Nov 2024 18:30:04 +0530 Subject: [PATCH] fix bug in query cache and fix todos page --- example/lib/pages/todos_page.dart | 8 +++----- lib/src/query_cache.dart | 19 ++++++++++++++----- lib/src/query_client.dart | 8 ++++++-- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/example/lib/pages/todos_page.dart b/example/lib/pages/todos_page.dart index 7929cf7..b60c965 100644 --- a/example/lib/pages/todos_page.dart +++ b/example/lib/pages/todos_page.dart @@ -1,7 +1,6 @@ // ignore_for_file: public_member_api_docs, sort_constructors_first import 'dart:math'; -import 'package:basic/main.dart'; import 'package:basic/widgets/todo_list_tile.dart'; import 'package:basic/models/todos.dart'; import 'package:flutter/cupertino.dart'; @@ -26,11 +25,10 @@ class TodosPage extends HookWidget { final todoInputController = useTextEditingController(); final addTodoMutation = useMutation>( todosAPI.add, onMutate: (text) async { - final previousTodos = - queryClient.getQueryData>(['todos']) ?? []; + final previousTodos = client.getQueryData>(['todos']) ?? []; // Optimistically update the todo list - queryClient.setQueryData>(['todos'], (previous) { + client.setQueryData>(['todos'], (previous) { final id = Random().nextInt(pow(10, 6).toInt()); final newTodo = Todo(id: id, text: text); return [...(previous ?? []), newTodo]; @@ -40,7 +38,7 @@ class TodosPage extends HookWidget { return previousTodos; }, onError: (err, text, previousTodos) { // On failure, revert back to original data - queryClient.setQueryData>( + client.setQueryData>( ['todos'], (_) => previousTodos as List, ); diff --git a/lib/src/query_cache.dart b/lib/src/query_cache.dart index c9f8438..a12e061 100644 --- a/lib/src/query_cache.dart +++ b/lib/src/query_cache.dart @@ -9,8 +9,12 @@ class QueryCache extends ChangeNotifier { final QueriesMap _queries = {}; QueriesMap get queries => _queries; - Query? get(QueryKey queryKey) { - return _queries[queryKey.lock] as Query?; + Query get(QueryKey queryKey) { + final query = _queries[queryKey.lock]; + if (query == null) { + throw ArgumentError("Query with given key doesn't exist."); + } + return query as Query; } void add(QueryKey queryKey, Query query) { @@ -30,9 +34,14 @@ class QueryCache extends ChangeNotifier { required QueryKey queryKey, required QueryClient client, }) { - var query = - get(queryKey) ?? Query(client: client, key: queryKey); - add(queryKey, query); + late final Query query; + try { + query = get(queryKey); + add(queryKey, query); + } catch (e) { + query = Query(client: client, key: queryKey); + add(queryKey, query); + } return query; } diff --git a/lib/src/query_client.dart b/lib/src/query_client.dart index 3855031..7a7f595 100644 --- a/lib/src/query_client.dart +++ b/lib/src/query_client.dart @@ -56,8 +56,12 @@ class QueryClient { } TData? getQueryData(QueryKey queryKey) { - final query = queryCache.get(queryKey); - return query?.state.data; + try { + final query = queryCache.get(queryKey); + return query.state.data; + } catch (e) { + return null as TData?; + } } /// Marks the query as stale.