Skip to content

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) にて再現するが、具体的にどこが原因かは特定できていない。