Flutter_GraphQL キャッシュについて
キャッシュが効かない問題について
複雑なQueryについて、キャッシュが効かないことが知られている。 似たようなフラグメントの塊が同じQueryにあって、微妙に違うみたいな時にバグるっぽい
DANGER
特にエラーが発生しないため注意
cache が hit しないとき、handleException: false にするとエラーメッセージが表示される。
falseにするとおおよそ、以下のエラーが発生する。
══╡ EXCEPTION CAUGHT BY FLUTTER FRAMEWORK ╞═════════════════════════════════════════════════════════
The following message was thrown:
PartialDataException(path:
user({"id":"18355"}).pastEvents({"limit":10}).validParticipants.character)
When the exception was thrown, this was the stack:
#0 denormalizeNode.<anonymous closure> (package:normalize/src/denormalize_node.dart:119:11)
#1 ListBase.fold (dart:collection/list.dart:202:22)
#2 denormalizeNode (package:normalize/src/denormalize_node.dart:68:29)
#3 denormalizeOperation (package:normalize/src/denormalize_operation.dart:66:12)
#4 NormalizingDataProxy.readQuery (package:graphql/src/cache/_normalizing_data_proxy.dart:85:7)
#5 QueryManager.maybeRebroadcastQueries (package:graphql/src/core/query_manager.dart:479:34)
#6 QueryManager.subscribe.<anonymous closure> (package:graphql/src/core/query_manager.dart:141:13)
#29 AddLogLink.request (package:uzu/graphql/links/log.dart)
<asynchronous suspension>
<asynchronous suspension>
(elided 23 frames from dart:async and dart:async-patch)
════════════════════════════════════════════════════════════════════════════════════════════════════調査メモ
アプリケーションからは、QueryResult.source で cache から取得されたかnetworkから取得されたかが判別できる
QueryManager.watchQuery は最終的に、_resolveQueryEagerly が呼ばれる。 以下の部分がQuery を cache から read するところ https://github.com/zino-hofmann/graphql-flutter/blob/main/packages/graphql/lib/src/core/query_manager.dart#L313
version 4.5.1 時点でのマイページで発行しているQuery (CurrentUserProfileScreen) にて再現するが、具体的にどこが原因かは特定できていない。