From 690d53f21bceac294d00b0bbd7cc703f0db75e38 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Wed, 29 Jan 2025 17:00:06 -0800 Subject: [PATCH] fixes #4576 --- reflex/components/core/foreach.py | 11 +++++++++-- reflex/utils/exceptions.py | 4 ++++ reflex/vars/base.py | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/reflex/components/core/foreach.py b/reflex/components/core/foreach.py index 30dda9c6a..57e439e7c 100644 --- a/reflex/components/core/foreach.py +++ b/reflex/components/core/foreach.py @@ -11,6 +11,7 @@ from reflex.components.component import Component from reflex.components.tags import IterTag from reflex.constants import MemoizationMode from reflex.state import ComponentState +from reflex.utils.exceptions import UntypedVarError from reflex.vars.base import LiteralVar, Var @@ -72,8 +73,14 @@ class Foreach(Component): iterable=iterable, render_fn=render_fn, ) - # Keep a ref to a rendered component to determine correct imports/hooks/styles. - component.children = [component._render().render_component()] + try: + # Keep a ref to a rendered component to determine correct imports/hooks/styles. + component.children = [component._render().render_component()] + except UntypedVarError as e: + raise UntypedVarError( + f"Could not foreach over var `{iterable!s}` without a type annotation. " + "See https://reflex.dev/docs/library/dynamic-rendering/foreach/" + ) from e return component def _render(self) -> IterTag: diff --git a/reflex/utils/exceptions.py b/reflex/utils/exceptions.py index be3f6ab69..05fbb297c 100644 --- a/reflex/utils/exceptions.py +++ b/reflex/utils/exceptions.py @@ -75,6 +75,10 @@ class VarAttributeError(ReflexError, AttributeError): """Custom AttributeError for var related errors.""" +class UntypedVarError(ReflexError, TypeError): + """Custom TypeError for untyped var errors.""" + + class UntypedComputedVarError(ReflexError, TypeError): """Custom TypeError for untyped computed var errors.""" diff --git a/reflex/vars/base.py b/reflex/vars/base.py index b9055c860..dbb393071 100644 --- a/reflex/vars/base.py +++ b/reflex/vars/base.py @@ -1216,7 +1216,7 @@ class Var(Generic[VAR_TYPE]): raise TypeError("Cannot reverse non-list var.") if self._var_type is Any: - raise TypeError( + raise exceptions.UntypedVarError( f"You must provide an annotation for the state var `{self!s}`. Annotation cannot be `{self._var_type}`." )