Skip to content

set action on list-item VM listener: cross-VM String writes silently no-op while List Attributes Index Numbers propagate #445

@bitfieldcore

Description

@bitfieldcore

Hi Rive team, sharing something we observed and wanted to check whether it's expected behavior or a runtime gap.

We have a state-machine listener on a list-item view model (ItemVM, the item type for a ParentVM/items PropertyList), triggered on Pointer Down. The listener has two set actions, both writing from the row's own VM up to the parent VM:

  1. set ParentVM/itemIndex to ItemVM/index — where ItemVM/index is a List Attributes → Index property (auto-populated row position).
  2. set ParentVM/itemId to ItemVM/itemId — where ItemVM/itemId is a String property the app populates at row-push time, before appendInstance.

Action 1 propagates correctly. Swift reads ParentVM/itemIndex via value(of: NumberProperty(path: "itemIndex")) and gets the correct row position on every Pointer Down.

Action 2 does not appear to propagate. Swift reads ParentVM/itemId via value(of: StringProperty(path: "itemId")) — the property exists (no "could not find property" error), but the value comes back empty even though ItemVM/itemId is verifiably non-empty for that row (the row's own bound text run on the same artboard renders the value correctly, and reading it directly through a per-row wrapper returns the right value).

Both actions live on the same listener and the same trigger event. The only differences are the source property type (Number vs. String) and the source kind (List Attributes Index vs. user-bound). The editor accepts the configuration without warning.

What makes this look like a list-item-VM-listener-context gap rather than a String-write gap in general: we've separately verified that String literal writes and Trigger fires propagate correctly across VM tiers when the listener lives on a script-instantiated child artboard (an Input<Artboard<X>>:instance()-rendered child whose own state-machine listener writes to a different VM). Same data-binding mechanism, same destination property type — different host context for the listener, and that one works. Cross-VM writes from main-artboard button listeners also work for arbitrary types in our app.

Is the cross-VM set pipeline expected to handle arbitrary user-bound Strings on list-item-VM listeners specifically, or is the auto-populated List Attributes Index path the only one supported from that context? Happy to share a minimal .riv repro and Swift logs if it's a runtime gap.

(Same behavior on rive-ios 6.19.1 and on rive-app/rive-ios main HEAD 082bf9d. Separately filed an unrelated CommandQueue listener-handle issue on rive-runtime as #95 — flagging in case there's any shared causation around the same VMI surface, though the mechanism appears different.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions