RefRegistry class

Static registry mapping [ref=eN] tokens to RefEntry records.

V3 mints a fresh e<N> token every time register is called UNLESS a SemanticsNode is supplied AND a token has already been issued for the same node.id — in which case the previously-issued token is returned and its payload is refreshed in place. This is what makes repeated flutter_snapshot calls on an unchanged tree return identical refs (Step 6 acceptance test (b)).

The dedupe key is node.id ALONE (not groupId + node.id): every snapshot mints a fresh groupId, but the agent should observe stable tokens for stable widgets across snapshots. On a cache hit the entry's stored groupId is updated to the latest snapshot's id so disposal of older snapshot groups never invalidates a token still referenced by a newer snapshot.

Tokens are scoped to a groupId (e.g. snapshot-1700000000000). The owning extension calls disposeGroup when the group is superseded (next snapshot, or page navigation) — every entry whose current groupId matches is removed atomically.

All state is static. Tests must call resetForTesting (or the legacy disposeAll) in setUp to avoid bleed-through between test cases.

Thread safety

All VM Service extension calls arrive on the root isolate. No cross- isolate mutation occurs; no synchronization primitives are needed.

Properties

hashCode → int
The hash code for this object.
no setterinherited
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited

Methods

noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() → String
A string representation of this object.
inherited

Operators

operator ==(Object other) → bool
The equality operator.
inherited

Static Properties

instance → RefRegistry
Sentinel instance for enricher contracts.
final

Static Methods

activeRefs() → Iterable<String>
Returns every currently-registered ref token (both eN and qN).
disposeAll() → void
Removes every entry in the registry and resets the counter.
disposeGroup(String groupId) → void
Removes every entry whose current groupId equals groupId. Subsequent lookup calls for those tokens return null.
lookup(String ref) → RefEntry?
Looks up RefEntry by token. Returns null if the token is unknown or its owning group has been disposed.
lookupQuery(String ref) → DuskQuery?
Looks up the stored DuskQuery for a q<N> token. Returns null when the token is unknown (e.g. after disposeAll, or for e<N> tokens which live in the _entries map instead).
refsForGroup(String groupId) → List<String>
Returns every token whose current groupId equals groupId.
register({required Rect rect, required Element element, required String groupId, required bool isTextField, SemanticsNode? node, RenderObject? renderObject}) → String
Mints (or returns the cached) token for the supplied tree references.
registerForTesting({required Rect rect, required Element element, required String groupId, required bool isTextField}) → String
Registers an entry directly, bypassing the Semantics walk.
registerQuery(DuskQuery query) → String
Mints a fresh q<N> query handle for the supplied predicate set and stores it for subsequent action-tool re-resolution.
resetForTesting() → void
Alias of disposeAll with a clearer name for setUp blocks.