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

  1. Remove the default value from the `rx.EventHandler` parameter so callers must pass it
  2. 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

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


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