reflex-dev/reflex · error · TypeError
`rx.EventHandler` parameter `{parameter.name}` in `{fn_name}
Error message
`rx.EventHandler` parameter `{parameter.name}` in `{fn_name}` must not have a default value. What it means
An `rx.EventHandler` parameter in a component-returning `@rx.memo` was given a default value. Event triggers must always be supplied explicitly by the caller so the compiler can generate the prop wiring; defaults would create silently dead triggers. Reflex raises this TypeError at decoration time.
Source
Thrown at packages/reflex-base/src/reflex_base/components/memo.py:967
) -> None:
if not for_component:
msg = (
f"`rx.EventHandler` parameters are only supported on component-"
f"returning memos. Got `{parameter.name}` in `{fn_name}`."
)
raise TypeError(msg)
if parameter.name == "children":
msg = (
f"`children` in `{fn_name}` cannot be an `rx.EventHandler`; "
"use `rx.Var[rx.Component]`."
)
raise TypeError(msg)
if parameter.default is not inspect.Parameter.empty:
msg = (
f"`rx.EventHandler` parameter `{parameter.name}` in `{fn_name}` "
"must not have a default value."
)
raise TypeError(msg)
def _placeholder_name_value(name: str, js_prop_name: str, for_component: bool) -> str:
return js_prop_name + CAMEL_CASE_MEMO_MARKER if for_component else name
def _placeholder_name_passthrough(
name: str, js_prop_name: str, for_component: bool
) -> str:
return name
def _make_value_placeholder(param: MemoParam) -> Var:
return _var_placeholder(param.placeholder_name, param.annotation)
def _make_rest_placeholder_spec(param: MemoParam) -> RestProp:
return _rest_placeholder(param.placeholder_name)View on GitHub (pinned to 45b8ed5ab7)
Solutions
- Remove the default value from the `rx.EventHandler` parameter so callers must pass it
- If the event is genuinely optional, handle optionality at the call site (pass a no-op handler explicitly) or accept `rx.Var[bool]`/optional props instead
Example fix
// before
@rx.memo
def item(text: rx.Var[str], on_click: rx.EventHandler = rx.event(no_op)) -> rx.Component:
...
// after
@rx.memo
def item(text: rx.Var[str], on_click: rx.EventHandler) -> rx.Component:
... Defensive patterns
Strategy: validation
Validate before calling
import inspect, reflex as rx
def check_handler_defaults(fn) -> None:
for p in inspect.signature(fn).parameters.values():
if p.annotation is rx.EventHandler and p.default is not inspect.Parameter.empty:
raise TypeError(f"rx.EventHandler param {p.name!r} must not have a default") Type guard
import inspect, reflex as rx
def handler_params_have_no_defaults(fn) -> bool:
return all(
p.default is inspect.Parameter.empty
for p in inspect.signature(fn).parameters.values()
if p.annotation is rx.EventHandler
) Prevention
- Never give rx.EventHandler parameters defaults in memos
- Pass a no-op handler explicitly at the call site when an event is optional
When it happens
Trigger: Declaring something like `def my_memo(on_click: rx.EventHandler = rx.event(lambda: None)) -> rx.Component` — the parameter's `default` is not `inspect.Parameter.empty` when `_validate_event_trigger` inspects it.
Common situations: Copy-pasting a plain function with keyword defaults into a memo; IDE autocompletion inserting a no-op default; trying to make an event prop 'optional' like a normal value prop.
Related errors
- `rx.EventHandler` parameters are only supported on component
- `children` in `{fn_name}` cannot be an `rx.EventHandler`; us
- Var-returning `@rx.memo` `{func_name}` cannot depend on embe
- Var-returning `@rx.memo` `{func_name}` cannot import `{lib}`
- `rx.Var[rx.Component]` parameters in `{fn_name}` must be nam
AI-assisted analysis of reflex-dev/reflex@45b8ed5ab7 (2026-08-28).
Data as JSON: /api/errors/8096fc7c00f551e9.
Report an issue: GitHub.