{"record":{"id":"14e6c3a149fc42d7","repo":"reflex-dev/reflex","slug":"dataeditor-data-must-be-an-arrayvar-if-rows-is-not","errorCode":null,"errorMessage":"DataEditor data must be an ArrayVar if rows is not provided.","messagePattern":"DataEditor data must be an ArrayVar if rows is not provided\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.py","lineNumber":522,"sourceCode":"            **props: The props of the data editor.\n\n        Returns:\n            The DataEditor component.&\n\n        Raises:\n            ValueError: invalid input.\n        \"\"\"\n        from reflex_components_core.el import Div\n\n        columns = props.get(\"columns\", [])\n        data = props.get(\"data\", [])\n        rows = props.get(\"rows\")\n\n        # If rows is not provided, determine from data.\n        if rows is None:\n            if isinstance(data, Var) and not isinstance(data, ArrayVar):\n                msg = \"DataEditor data must be an ArrayVar if rows is not provided.\"\n                raise ValueError(msg)\n\n            props[\"rows\"] = data.length() if isinstance(data, ArrayVar) else len(data)\n\n        if not isinstance(columns, Var) and len(columns):\n            if types.is_dataframe(type(data)) or (\n                isinstance(data, Var) and types.is_dataframe(data._var_type)\n            ):\n                msg = \"Cannot pass in both a pandas dataframe and columns to the data_editor component.\"\n                raise ValueError(msg)\n            props[\"columns\"] = [\n                format.format_data_editor_column(col) for col in columns\n            ]\n\n        if \"theme\" in props:\n            theme = props.get(\"theme\")\n            if isinstance(theme, Mapping):\n                props[\"theme\"] = DataEditorTheme(**theme)\n","sourceCodeStart":504,"sourceCodeEnd":540,"githubUrl":"https://github.com/reflex-dev/reflex/blob/45b8ed5ab735f8a56bbb09a42384f030eb0208e7/packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.py#L504-L540","documentation":"data_editor needs to know the row count. When rows is not given, it derives it from data — but only ArrayVar data supports .length(); a non-array Var (e.g. a dict-typed state var) has no length, so Reflex raises this.","triggerScenarios":"Passing data=State.my_dict_var or any Var whose type is not an array (dict, object, DataFrame-unwrapped var) without rows=... to data_editor.","commonSituations":"Switching data from a list-based state var to a dict/computed var and forgetting to pass rows; passing a DataFrame-backed var shaped differently than expected.","solutions":["Pass an explicit rows=count or rows=State.n_rows prop","Type the data var as a list/array (e.g. data: list[list] on state) so it is an ArrayVar","If data is a DataFrame, ensure it is passed as the raw DataFrame or a properly typed var"],"exampleFix":"# before\nrx.data_editor(data=State.table_data)  # dict var\n# after\nrx.data_editor(data=State.table_data, rows=State.row_count)","handlingStrategy":"validation","validationCode":"from reflex.vars import Var\nif isinstance(data, Var) and not _is_array_var(data) and rows is None:\n    rows = fallback_row_count  # or raise early with your own message","typeGuard":"def needs_explicit_rows(data: Any, rows: Any) -> bool:\n    from reflex.vars import ArrayVar\n    return rows is None and isinstance(data, Var) and not isinstance(data, ArrayVar)","tryCatchPattern":null,"preventionTips":["Always pass rows when data isn't a list-typed var","Annotate state data vars as list[list[Any]]"],"tags":["reflex","dataeditor","rows"],"backgroundTag":"missing-required-prop","analyzedSha":"45b8ed5ab735f8a56bbb09a42384f030eb0208e7","analyzedAt":"2026-08-28T19:25:27.644Z","schemaVersion":2},"datasetVersion":"2026-08-28T21:17:43.275Z"}