{"record":{"id":"d840a44cca2ba475","repo":"reflex-dev/reflex","slug":"expected-1-or-2-parameters-in-foreach-render-funct","errorCode":null,"errorMessage":"Expected 1 or 2 parameters in foreach render function, got {[p.name for p in params]}. See https://reflex.dev/docs/library/dynamic-rendering/foreach/","messagePattern":"Expected 1 or 2 parameters in foreach render function, got (.+?)\\. See https://reflex\\.dev/docs/library/dynamic-rendering/foreach/","errorType":"exception","errorClass":"ForeachRenderError","httpStatus":null,"severity":"error","filePath":"packages/reflex-components-core/src/reflex_components_core/core/foreach.py","lineNumber":137,"sourceCode":"                \"foreach\",\n                \"https://reflex.dev/docs/library/dynamic-rendering/foreach/\",\n            ).with_traceback(e.__traceback__) from None\n        return component\n\n    def _render(self) -> IterTag:\n        props = {}\n\n        render_sig = inspect.signature(self.render_fn)\n        params = list(render_sig.parameters.values())\n\n        # Validate the render function signature.\n        if len(params) == 0 or len(params) > 2:\n            msg = (\n                \"Expected 1 or 2 parameters in foreach render function, got \"\n                f\"{[p.name for p in params]}. See \"\n                \"https://reflex.dev/docs/library/dynamic-rendering/foreach/\"\n            )\n            raise ForeachRenderError(msg)\n\n        if len(params) >= 1:\n            # Determine the arg var name based on the params accepted by render_fn.\n            props[\"arg_var_name\"] = params[0].name + FIELD_MARKER\n\n        if len(params) == 2:\n            # Determine the index var name based on the params accepted by render_fn.\n            props[\"index_var_name\"] = params[1].name + FIELD_MARKER\n        else:\n            render_fn = self.render_fn\n            # Otherwise, use a deterministic index, based on the render function bytecode.\n            if (render_fn_code := getattr(render_fn, \"__code__\", None)) is not None:\n                code_hash = md5(render_fn_code.co_code).hexdigest()\n            elif isinstance(render_fn, functools.partial):\n                code_hash = md5(render_fn.func.__code__.co_code).hexdigest()\n            else:\n                code_hash = md5(repr(render_fn).encode()).hexdigest()\n            props[\"index_var_name\"] = f\"index_{code_hash}\"","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-components-core/src/reflex_components_core/core/foreach.py#L119-L155","documentation":"The render function passed to `rx.foreach` may accept 1 parameter (the item) or 2 parameters (item, index) for lists, or (key, value) for dicts. Zero or more than two parameters — including params with defaults counting toward the signature — raise ForeachRenderError.","triggerScenarios":"`rx.foreach(State.items, lambda: rx.text('x'))`; a render def with three params like def render(item, index, extra); accidentally passing a component class constructor expecting many args.","commonSituations":"Reusing a component factory function with extra arguments; refactoring a render fn and leaving stale parameters.","solutions":["Use exactly one parameter: rx.foreach(State.items, lambda item: rx.text(item))","Or two for index access: rx.foreach(State.items, lambda item, i: rx.text(f'{i}: {item}'))","Wrap multi-arg builders in a closure: lambda item: make_row(item, 'extra')"],"exampleFix":"# before\ndef render_row(item, index, is_admin): ...\nrx.foreach(State.items, render_row)\n# after\nrx.foreach(State.items, lambda item, i: render_row(item, i, State.is_admin))","handlingStrategy":"validation","validationCode":"import inspect\nparams = inspect.signature(render_fn).parameters\nassert 1 <= len(params) <= 2, f'render fn takes 1-2 params, got {len(params)}'","typeGuard":"def valid_foreach_fn(fn) -> bool:\n    import inspect\n    return 1 <= len(inspect.signature(fn).parameters) <= 2","tryCatchPattern":null,"preventionTips":["Keep foreach render fns to lambda item / lambda item, index","Use closures to bind extra arguments"],"tags":["reflex","foreach","function-signature"],"backgroundTag":"invalid-function-signature","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}