reflex-dev/reflex · error · TypeError

ComputedVar dependencies must be Var instances or var names

Error message

ComputedVar dependencies must be Var instances or var names (non-empty strings).

What it means

When you declare explicit dependencies for a ComputedVar via deps=[...], each entry must be either a Var instance or a non-empty string naming another var. Anything else (None, empty string, int, arbitrary objects) raises this TypeError during dependency setup.

Source

Thrown at packages/reflex-base/src/reflex_base/vars/base.py:2423

        """
        if deps is None:
            deps = self._static_deps
        if isinstance(dep, Var):
            state_name = (
                all_var_data.state
                if (all_var_data := dep._get_all_var_data()) and all_var_data.state
                else None
            )
            if all_var_data is not None:
                var_name = all_var_data.field_name
            else:
                var_name = dep._js_expr
            deps.setdefault(state_name, set()).add(var_name)
        elif isinstance(dep, str) and dep != "":
            deps.setdefault(None, set()).add(dep)
        else:
            msg = "ComputedVar dependencies must be Var instances or var names (non-empty strings)."
            raise TypeError(msg)
        return deps

    @override
    def _replace(
        self,
        merge_var_data: VarData | None = None,
        **kwargs: Any,
    ) -> Self:
        """Replace the attributes of the ComputedVar.

        Args:
            merge_var_data: VarData to merge into the existing VarData.
            **kwargs: Var fields to update.

        Returns:
            The new ComputedVar instance.

        Raises:

View on GitHub (pinned to 45b8ed5ab7)

Solutions

  1. Filter/validate deps before passing: keep only Var instances and non-empty strings
  2. Reference dependencies as state var names, e.g. deps=[State.other_value] or deps=['other_value']
  3. Check for None/empty entries introduced by conditional logic in dynamically-built dep lists

Example fix

# before
@rx.var(deps=[self.first_name if flag else None])
def greeting(self) -> str: ...

# after
@rx.var(deps=[State.first_name])
def greeting(self) -> str: ...

# or for dynamic lists:
deps = [d for d in maybe_deps if isinstance(d, (str, rx.Var)) and d]
Defensive patterns

Strategy: validation

Validate before calling

from reflex.vars import Var

def valid_deps(deps) -> list:
    return [d for d in deps if isinstance(d, Var) or (isinstance(d, str) and d)]

# usage
rx.var(deps=valid_deps(candidate_deps))(fn)

Type guard

from reflex.vars import Var

def is_valid_dep(dep) -> bool:
    return isinstance(dep, Var) or (isinstance(dep, str) and dep != '')

Try / catch

try:
    cv = rx.var(deps=deps)(fn)
except TypeError as e:
    if 'dependencies must be Var instances' in str(e):
        cv = rx.var(deps=[d for d in deps if isinstance(d, (Var, str)) and d])(fn)
    else:
        raise

Prevention

When it happens

Trigger: Passing deps=[None], deps=[''], deps=[0], or a list containing a lambda/function or plain object to rx.var(deps=...) / ComputedVar(deps=...); building deps programmatically and including an uninitialized/None entry.

Common situations: Conditionally collecting dependency names into a list and leaving None placeholders; passing a method/function instead of a Var or its name; copy-pasting a deps list from a State where the referenced Var was renamed or deleted.

Related errors


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