From c94be3d72dfa6b144bba725b6a5877fdf5a3595d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Aracheski?= <21148235+joaoaracheski@users.noreply.github.com> Date: Fri, 13 Nov 2026 15:34:43 -0300 Subject: [PATCH 1/2] Declare dataclasses.field as a field specifier for @control and @value Fixes #6377. Without field_specifiers, type checkers ignore dataclasses.field() arguments such as init=False on classes built with @control and @value. --- .../packages/flet/src/flet/controls/base_control.py | 2 +- .../packages/flet/src/flet/controls/value_types.py | 2 +- sdk/python/packages/flet/tests/test_base_control.py | 12 ++++++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/sdk/python/packages/flet/src/flet/controls/base_control.py b/sdk/python/packages/flet/src/flet/controls/base_control.py index 87a727bbf2..13f5646474 100644 --- a/sdk/python/packages/flet/src/flet/controls/base_control.py +++ b/sdk/python/packages/flet/src/flet/controls/base_control.py @@ -88,7 +88,7 @@ def control( ... -@dataclass_transform() +@dataclass_transform(field_specifiers=(field,)) def control( dart_widget_name: Optional[Union[type[T], str]] = None, *, diff --git a/sdk/python/packages/flet/src/flet/controls/value_types.py b/sdk/python/packages/flet/src/flet/controls/value_types.py index 934c1db1c0..374cc6aa6e 100644 --- a/sdk/python/packages/flet/src/flet/controls/value_types.py +++ b/sdk/python/packages/flet/src/flet/controls/value_types.py @@ -156,7 +156,7 @@ class explicitly. It is exposed so that `isinstance(obj, Value)` """ -@dataclass_transform() +@dataclass_transform(field_specifiers=(dataclasses.field,)) def value( cls: Optional[type] = None, **dataclass_kwargs: Any, diff --git a/sdk/python/packages/flet/tests/test_base_control.py b/sdk/python/packages/flet/tests/test_base_control.py index 70001e8ad9..f46becb5f2 100644 --- a/sdk/python/packages/flet/tests/test_base_control.py +++ b/sdk/python/packages/flet/tests/test_base_control.py @@ -1,4 +1,8 @@ +import dataclasses + import flet as ft +from flet.controls.base_control import control +from flet.controls.value_types import value def test_controls_equality(): @@ -31,3 +35,11 @@ def test_keys(): t1 = ft.Text("A", key=ft.ValueKey("1")) t2 = ft.Text("A", key=ft.ValueKey("1")) assert t1 == t2 + + +def test_dataclass_transforms_declare_field_specifiers(): + # Type checkers only honor `dataclasses.field()` arguments (e.g. `init=False`) + # on `@control` and `@value` classes when `field` is a declared field specifier. + for decorator in (control, value): + transform = decorator.__dataclass_transform__ + assert dataclasses.field in transform["field_specifiers"] From f6846728019e9f74bba4162c25642b0c03d94f84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Aracheski?= <21148235+joaoaracheski@users.noreply.github.com> Date: Fri, 13 Nov 2026 20:38:04 -0300 Subject: [PATCH 2/2] Add changelog entry and use a docstring in the field specifiers test --- CHANGELOG.md | 6 ++++++ sdk/python/packages/flet/tests/test_base_control.py | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59ea0b80e6..ee52308eaa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.1.3 + +### Bug fixes + +* Fix type checkers ignoring `dataclasses.field()` arguments such as `init=False` on `@control` and `@value` classes, by declaring `dataclasses.field` as a field specifier ([#6377](https://github.com/flet-dev/flet/issues/6377), [#7084](https://github.com/flet-dev/flet/pull/7084)) by @joaoaracheski. + ## 1.1.2 ### Improvements diff --git a/sdk/python/packages/flet/tests/test_base_control.py b/sdk/python/packages/flet/tests/test_base_control.py index f46becb5f2..c1ae3930a8 100644 --- a/sdk/python/packages/flet/tests/test_base_control.py +++ b/sdk/python/packages/flet/tests/test_base_control.py @@ -38,8 +38,10 @@ def test_keys(): def test_dataclass_transforms_declare_field_specifiers(): - # Type checkers only honor `dataclasses.field()` arguments (e.g. `init=False`) - # on `@control` and `@value` classes when `field` is a declared field specifier. + """ + Type checkers only honor `dataclasses.field()` arguments (e.g. `init=False`) + on `@control` and `@value` classes when `field` is a declared field specifier. + """ for decorator in (control, value): transform = decorator.__dataclass_transform__ assert dataclasses.field in transform["field_specifiers"]