reflex-dev/reflex · error · ValueError

Invalid event: {v}

Error message

Invalid event: {v}

What it means

Inside a list passed to an event trigger, each element must be an EventHandler, EventSpec, or Callable (lambda). Any other element (a Var, string, number, None) cannot be interpreted as an event and raises ValueError.

Source

Thrown at packages/reflex-base/src/reflex_base/event/__init__.py:938

        events: list[EventSpec | EventVar | FunctionVar] = []

        # If the input is a list of event handlers, create an event chain.
        if isinstance(value, list):
            for v in value:
                if isinstance(v, (EventHandler, EventSpec)):
                    # Call the event handler to get the event.
                    events.append(call_event_handler(v, args_spec, key=key))
                elif isinstance(v, (EventVar, EventChainVar)):
                    events.append(v)
                elif isinstance(v, FunctionVar):
                    # Apply the args_spec transformations as partial arguments to the function.
                    events.append(v.partial(*parse_args_spec(args_spec)[0]))
                elif isinstance(v, Callable):
                    # Call the lambda to get the event chain.
                    events.extend(call_event_fn(v, args_spec, key=key))
                else:
                    msg = f"Invalid event: {v}"
                    raise ValueError(msg)

        # If the input is a callable, create an event chain.
        elif isinstance(value, Callable):
            events.extend(call_event_fn(value, args_spec, key=key))

        # Otherwise, raise an error.
        else:
            msg = f"Invalid event chain: {value}"
            raise ValueError(msg)

        # Add args to the event specs if necessary.
        events = [
            (e.with_args(get_handler_args(e)) if isinstance(e, EventSpec) else e)
            for e in events
        ]

        # Return the event chain.
        return cls(

View on GitHub (pinned to 45b8ed5ab7)

Solutions

  1. Filter the list so it only contains EventHandler/EventSpec/lambda values
  2. Replace stray values with real event calls (or remove them)
  3. For optional events use an empty list or a no-op handler instead of None

Example fix

# before
on_click=[State.a, None]
# after
on_click=[State.a]
Defensive patterns

Strategy: validation

Validate before calling

from reflex_base.event import EventHandler, EventSpec
from collections.abc import Callable

def all_events(items):
    return all(isinstance(i, (EventHandler, EventSpec)) or callable(i) for i in items)

Type guard

def is_valid_event_list(items) -> TypeGuard[list]: return isinstance(items, list) and all(isinstance(i, (EventHandler, EventSpec, Callable)) for i in items)

Prevention

When it happens

Trigger: on_click=[State.a, 'state.b', 42] or a list containing None / a Var alongside valid handlers.

Common situations: Conditionally building event lists and letting a non-event fallback slip in (e.g. [handler] if cond else [None]); mixing string handler names from older Reflex versions into modern lists.

Related errors


AI-assisted analysis of reflex-dev/reflex@45b8ed5ab7 (2026-08-28). Data as JSON: /api/errors/769203046fed75f8. Report an issue: GitHub.