From c5b1cf683c49339dfbc62acb41cacffcdcf06726 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Fri, 22 Aug 2025 13:17:01 +0200 Subject: [PATCH 1/2] fix: improve TabBarView height handling --- packages/flet/lib/src/controls/tabs.dart | 63 +++++++++++++-------- sdk/python/examples/controls/tabs/nested.py | 2 +- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/packages/flet/lib/src/controls/tabs.dart b/packages/flet/lib/src/controls/tabs.dart index fb10ad8b36..5904f73b3b 100644 --- a/packages/flet/lib/src/controls/tabs.dart +++ b/packages/flet/lib/src/controls/tabs.dart @@ -157,35 +157,48 @@ class TabBarViewControl extends StatelessWidget { // Find the TabController from the nearest TabsControl ancestor final tabsState = context.findAncestorStateOfType<_TabsControlState>(); - if (tabsState != null) { - final tabController = tabsState._tabController; + if (tabsState == null) { + return const ErrorControl( + "TabBarView must be used within a Tabs control"); + } + + final tabController = tabsState._tabController; + + Widget buildConstrainedTabView() { + return ConstrainedControl( + control: control, + child: TabBarView( + controller: tabController, + clipBehavior: + control.getClipBehavior("clip_behavior", Clip.hardEdge)!, + viewportFraction: control.getDouble("viewport_fraction", 1.0)!, + children: control.buildWidgets("controls"), + )); + } - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints constraints) { - if (constraints.maxHeight == double.infinity && - control.getDouble("height") == null && - control.getExpand("expand", 0)! <= 0) { + // If expand property was set, we return the result directly. + // Because having Expanded as direct child of LayoutBuilder is not allowed. + if (control.getExpand("expand", 0)! > 0) { + return buildConstrainedTabView(); + } + + return LayoutBuilder( + builder: (context, constraints) { + final hasFixedHeight = control.getDouble("height") != null; + final hasUnboundedHeight = + constraints.maxHeight == double.infinity && !hasFixedHeight; + + if (hasUnboundedHeight) { return const ErrorControl( - "Error displaying TabBarView: height is unbounded.", - description: - "Set a fixed height, a non-zero expand, or/and place inside " - "a control with bounded height."); + "Error displaying TabBarView: height is unbounded.", + description: + "Set a fixed height, a non-zero expand, or place it inside a control with bounded height.", + ); } - return ConstrainedControl( - control: control, - child: TabBarView( - controller: tabController, - clipBehavior: - control.getClipBehavior("clip_behavior", Clip.hardEdge)!, - viewportFraction: control.getDouble("viewport_fraction", 1.0)!, - children: control.buildWidgets("controls"), - )); - }); - } else { - return const ErrorControl( - "TabBarView must be used within a Tabs control"); - } + return buildConstrainedTabView(); + }, + ); } } diff --git a/sdk/python/examples/controls/tabs/nested.py b/sdk/python/examples/controls/tabs/nested.py index d3c3bfc4b0..f898c85fd0 100644 --- a/sdk/python/examples/controls/tabs/nested.py +++ b/sdk/python/examples/controls/tabs/nested.py @@ -18,6 +18,7 @@ def main(page: ft.Page): ft.TabBarView( expand=True, controls=[ + ft.Text("Main Tab 1 content"), ft.Tabs( length=2, expand=True, @@ -41,7 +42,6 @@ def main(page: ft.Page): ], ), ), - ft.Text("Main Tab 1 content"), ], ), ], From 974738de70b1e2f6cf108161756e5f599c0a1115 Mon Sep 17 00:00:00 2001 From: ndonkoHenri Date: Fri, 22 Aug 2025 13:17:38 +0200 Subject: [PATCH 2/2] add test for nested Tabs --- .../controls/golden/macos/tabs/basic.png | Bin 0 -> 14683 bytes .../controls/golden/macos/tabs/nesting.png | Bin 0 -> 24471 bytes .../controls/golden/macos/tabs/tabs_basic.png | Bin 14683 -> 0 bytes .../integration_tests/controls/test_tabs.py | 77 +++++++++++++++--- 4 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/tabs/basic.png create mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/tabs/nesting.png delete mode 100644 sdk/python/packages/flet/integration_tests/controls/golden/macos/tabs/tabs_basic.png diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/tabs/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/tabs/basic.png new file mode 100644 index 0000000000000000000000000000000000000000..9268dc81620eeb654b0976cea2c06bb04a848f61 GIT binary patch literal 14683 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 literal 0 HcmV?d00001 diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/tabs/tabs_basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/tabs/tabs_basic.png deleted file mode 100644 index baad6ff9b024a1328ede566465ed1de0810c8104..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14683 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 AS^xk5 diff --git a/sdk/python/packages/flet/integration_tests/controls/test_tabs.py b/sdk/python/packages/flet/integration_tests/controls/test_tabs.py index ba97e830ad..167eb5f890 100644 --- a/sdk/python/packages/flet/integration_tests/controls/test_tabs.py +++ b/sdk/python/packages/flet/integration_tests/controls/test_tabs.py @@ -5,7 +5,7 @@ @pytest.mark.asyncio(loop_scope="module") -async def test_tabs_basic(flet_app: ftt.FletTestApp, request): +async def test_basic(flet_app: ftt.FletTestApp, request): await flet_app.assert_control_screenshot( name=request.node.name, expand_screenshot=True, @@ -19,20 +19,71 @@ async def test_tabs_basic(flet_app: ftt.FletTestApp, request): ft.Tab(label="Tab 2", icon=ft.Icons.SETTINGS), ] ), - ft.Container( + ft.TabBarView( expand=True, - content=ft.TabBarView( - controls=[ - ft.Container( - content=ft.Text("This is Tab 1"), - alignment=ft.Alignment.CENTER, - ), - ft.Container( - content=ft.Text("This is Tab 3"), - alignment=ft.Alignment.CENTER, + controls=[ + ft.Container( + content=ft.Text("This is Tab 1"), + alignment=ft.Alignment.CENTER, + ), + ft.Container( + content=ft.Text("This is Tab 3"), + alignment=ft.Alignment.CENTER, + ), + ], + ), + ], + ), + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_nesting(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + name=request.node.name, + expand_screenshot=True, + control=ft.Tabs( + length=2, + expand=True, + selected_index=1, + content=ft.Column( + expand=True, + controls=[ + ft.TabBar( + tabs=[ + ft.Tab(label=ft.Text("Main Tab 1")), + ft.Tab(label=ft.Text("Main Tab 2")), + ], + ), + ft.TabBarView( + expand=True, + controls=[ + ft.Text("Main Tab 1 content"), + ft.Tabs( + length=2, + expand=True, + content=ft.Column( + expand=True, + controls=[ + ft.TabBar( + secondary=True, + tabs=[ + ft.Tab(label=ft.Text("SubTab 1")), + ft.Tab(label=ft.Text("SubTab 2")), + ], + ), + ft.TabBarView( + expand=True, + controls=[ + ft.Text("Nested Tab 1 content"), + ft.Text("Nested Tab 2 content"), + ], + ), + ], ), - ], - ), + ), + ], ), ], ),