hindsight_flutter 0.9.5
hindsight_flutter: ^0.9.5 copied to clipboard
Session replay for Flutter tree/state-delta capture with compact scene-graph encoding.
Changelog #
0.9.5 #
- Captures one CLEAN keyframe per route/overlay transition instead of sampling a
mid-animation pose. A new
HindsightTransitionGatetracks the in-flight route animation (via its status, endpoint-agnostic so a cancelled back-swipe cannot leak) and a transient-callback quiet window for routeless overlays; while a transition is in flight all route/pointer/focus/metrics-driven content captures are deferred, and exactly one settled capture runs when the animation completes. This removes the dropped-first-frame jank and the mid-animation tree state that made replays drift and freeze. The navigator observer no longer fires a mid-slide layer-activity notify. - Adds
HindsightVisualSource.currentColorso vector adapters can record the resolved SVGcurrentColorseparately from a srcIncolortint; the collector emits it ascurrent_coloron vector nodes.
0.9.4 #
- Stops route/dialog/overlay transitions from running full tree captures on the animation's frames. A focus or viewport-metrics change no longer triggers an immediate plus two follow-up forced captures (previously at 0ms/80ms/280ms); it now schedules a single capture after the transition settles. The route and focus events still mark the user flow and the player interpolates the animation, so transition fidelity is preserved while the host app keeps its first animation frame. Fixes the dropped-first-frame jank when opening or closing dialogs and pushing/popping routes.
- Stops the settle-verify capture from forcing a tree walk onto a follow-up scroll's frames. After an emitting capture the verify pass is deferred to the scroll-settle path whenever a new scroll has begun, so repeated swipes no longer trigger a self-sustaining ~400ms forced-walk loop that stuttered mid-scroll. The final settled state is still captured once the scroll ends.
- Player: scroll traces now expand each per-sample observed time onto the inactivity-detection axis instead of collapsing the whole span to a single frame time. A genuine (long or isolated) scroll span is no longer mislabeled as an idle gap and fast-forwarded ("skip x16").
0.9.3 #
- Changes the default active-scroll content policy to defer expensive Flutter
tree captures until scroll settle.
scrollContentCaptureMinIntervalnow defaults toDuration.zero, so scroll gestures keep recording offset traces without doing periodic full tree walks on the UI isolate. - Keeps mid-scroll content keyframes available as an explicit opt-in: set a
positive
scrollContentCaptureMinIntervalwhen the extra replay fidelity is worth the host app performance cost. - Replaces active-scroll viewport observation's per-frame render-tree scan with
tracked scroll targets discovered from pointer hit-tests and scroll
notifications. Apps that consume
ScrollNotifications still get scroll offset sampling without the recorder walking unrelated render subtrees every frame.
0.9.2 #
- Stops generic Flutter animation/ticker frames from being treated as replay layer activity. This removes the periodic full-tree capture loop that could make host apps stutter and heat up when replay was enabled.
- Keeps explicit capture triggers intact: initial snapshots, pointer/tap-driven updates, scroll content cadence, route transitions, focus/viewport changes, and deferred shader-mask captures still schedule replay layer captures.
0.9.1 #
- Stops replay asset readiness from forcing another full layer capture. Raster,
image, painter, leaf-raster, and platform-view nodes now emit stable
image_refvalues during the first collection and publish bytes asynchronously under the same ref. - Keeps shader-mask deferred capture behavior, where a follow-up tree capture is still needed because the mask JSON itself is attached to captured nodes.
0.9.0 #
- Initial public release of the Hindsight Flutter session replay SDK.
- Captures Flutter UI as structured scene-graph layers, text, visual layers, scroll context, route changes, breadcrumbs, and errors.
- Keeps static UI text visible by default so replays remain legible.
- Masks user input by default through
maskAllInputs: true; obscured fields are always masked with no opt-out. - Adds targeted privacy controls through
HindsightRedact,Hindsight.mask<T>(),Hindsight.unmask<T>(),Hindsight.maskCallback<T>(), gesture privacy, image privacy, and debug masking overlays. - Adds visual source boundaries so optional adapters can capture declared UI vectors as structured vector metadata instead of PNG readbacks.
- Reuses unchanged unknown canvas leaf rasters from frame signals instead of waking or re-encoding from wall-clock age alone.
- Adds opt-in error hooks, HTTP/Dio breadcrumbs, console breadcrumbs, device breadcrumbs, session lifecycle controls, durable pending uploads, and remote SDK config polling.
- Adds Android/iOS native plugin support for platform-view capture.