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
- Filter the list so it only contains EventHandler/EventSpec/lambda values
- Replace stray values with real event calls (or remove them)
- 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
- Build event lists conditionally but filter out None/non-events before passing
- Prefer single handler chains over hand-built lists
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
- Invalid event chain: {value!s} of type {value._var_type}
- Invalid event chain: {value}
- Var-returning `@rx.memo` `{func_name}` cannot depend on embe
- Invalid prop(s) {invalid_fields_str} for {component_name!r}.
- default_color_mode must be one of {allowed_color_modes}, but
AI-assisted analysis of reflex-dev/reflex@45b8ed5ab7 (2026-08-28).
Data as JSON: /api/errors/769203046fed75f8.
Report an issue: GitHub.