From 536c04d9b3826463ce111bb9476775ac44a3461b Mon Sep 17 00:00:00 2001 From: Feodor Fitsner Date: Sat, 10 Oct 2026 14:07:07 -0700 Subject: [PATCH] flet build: fall back to [tool.flet.deep_linking] on Android and iOS (#6951) On Android and iOS flet build read only the platform's deep_linking table, so a project that configured deep linking once in [tool.flet.deep_linking] got no deep-link entries at all. Resolve each key from [tool.flet..deep_linking] first, then the common table, as the publish docs describe; other platforms keep reading only the common table. Closes #6951 --- CHANGELOG.md | 2 + .../src/flet_cli/commands/build_base.py | 45 ++++++++------- .../tests/test_build_platform_settings.py | 56 +++++++++++++++++++ 3 files changed, 84 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05403a6120..db4ee2b868 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ **Compatibility:** Apps built with `flet build` and the macOS desktop client now require macOS 12 or later, and iOS apps require iOS 15 or later. Custom build templates keep building, because Flutter 3.47 raises the deployment targets during the build; apply the same `Podfile` and Xcode project changes to skip that step. See the [macOS 12 and iOS 15 minimum](/docs/updates/breaking-changes/v1-1-0/minimum-macos-12-ios-15) guide. +* Fix `flet build` ignoring the common `[tool.flet.deep_linking]` on Android and iOS: it's now the fallback when `[tool.flet..deep_linking]` doesn't set a key, as documented ([#6951](https://github.com/flet-dev/flet/issues/6951)) by @FeodorFitsner. + ### Documentation * Group the Reference > Controls section of the docs into Core, Material, Cupertino, Shadcn and Extensions ([#6918](https://github.com/flet-dev/flet/pull/6918)) by @InesaFitsner. diff --git a/sdk/python/packages/flet-cli/src/flet_cli/commands/build_base.py b/sdk/python/packages/flet-cli/src/flet_cli/commands/build_base.py index 2a90003fac..4f11d953e9 100644 --- a/sdk/python/packages/flet-cli/src/flet_cli/commands/build_base.py +++ b/sdk/python/packages/flet-cli/src/flet_cli/commands/build_base.py @@ -1418,25 +1418,8 @@ def _xml_attr_value(v): normalized_providers[key] = normalized android_providers = normalized_providers - deep_linking_scheme = ( - self.get_pyproject("tool.flet.ios.deep_linking.scheme") - if self.package_platform == "iOS" - else ( - self.get_pyproject("tool.flet.android.deep_linking.scheme") - if self.package_platform == "Android" - else self.get_pyproject("tool.flet.deep_linking.scheme") - ) - ) - - deep_linking_host = ( - self.get_pyproject("tool.flet.ios.deep_linking.host") - if self.package_platform == "iOS" - else ( - self.get_pyproject("tool.flet.android.deep_linking.host") - if self.package_platform == "Android" - else self.get_pyproject("tool.flet.deep_linking.host") - ) - ) + deep_linking_scheme = self.get_deep_linking_setting("scheme") + deep_linking_host = self.get_deep_linking_setting("host") if self.options.deep_linking_scheme and self.options.deep_linking_host: deep_linking_scheme = self.options.deep_linking_scheme @@ -2960,6 +2943,30 @@ def get_bool_setting(self, cli_option, pyproj_setting, default_value): else self.get_platform_setting(pyproj_setting, default_value) ) + def get_deep_linking_setting(self, key: str): + """ + Resolve a deep-linking setting (`scheme` or `host`). + + On Android and iOS `[tool.flet..deep_linking]` overrides + `[tool.flet.deep_linking]`, which is the fallback; other platforms + read only the common table. Resolved per key, so a platform table + may override just one of them. + + Args: + key: `scheme` or `host`. + + Returns: + The configured value, or `None`. + """ + + assert self.get_pyproject + platform = {"Android": "android", "iOS": "ios"}.get(self.package_platform) + if platform: + value = self.get_pyproject(f"tool.flet.{platform}.deep_linking.{key}") + if value is not None: + return value + return self.get_pyproject(f"tool.flet.deep_linking.{key}") + def get_platform_setting(self, pyproj_setting, default_value=None): """ Resolve a pyproject setting with precedence: platform, global, default. diff --git a/sdk/python/packages/flet-cli/tests/test_build_platform_settings.py b/sdk/python/packages/flet-cli/tests/test_build_platform_settings.py index 154bcda75c..ba44ed4175 100644 --- a/sdk/python/packages/flet-cli/tests/test_build_platform_settings.py +++ b/sdk/python/packages/flet-cli/tests/test_build_platform_settings.py @@ -75,3 +75,59 @@ def test_other_platform_value_ignored(): def test_bool_setting_precedence(cli, pyproject, expected): cmd = _command(pyproject) assert cmd.get_bool_setting(cli, "compile.app", True) is expected + + +def _deep_linking_command(pyproject, package_platform): + cmd = _command(pyproject) + cmd.package_platform = package_platform + return cmd + + +_COMMON_DEEP_LINK = { + "tool.flet.deep_linking.scheme": "https", + "tool.flet.deep_linking.host": "app.example.com", +} + + +@pytest.mark.parametrize("package_platform", ["Android", "iOS", "Darwin", "Emscripten"]) +def test_common_deep_linking_is_the_fallback(package_platform): + cmd = _deep_linking_command(_COMMON_DEEP_LINK, package_platform) + assert cmd.get_deep_linking_setting("scheme") == "https" + assert cmd.get_deep_linking_setting("host") == "app.example.com" + + +@pytest.mark.parametrize( + ("package_platform", "section"), [("Android", "android"), ("iOS", "ios")] +) +def test_platform_deep_linking_overrides_common_per_key(package_platform, section): + cmd = _deep_linking_command( + { + **_COMMON_DEEP_LINK, + f"tool.flet.{section}.deep_linking.host": "m.example.com", + }, + package_platform, + ) + assert cmd.get_deep_linking_setting("scheme") == "https" + assert cmd.get_deep_linking_setting("host") == "m.example.com" + + +def test_platform_only_deep_linking(): + cmd = _deep_linking_command( + { + "tool.flet.ios.deep_linking.scheme": "myapp", + "tool.flet.ios.deep_linking.host": "open", + }, + "iOS", + ) + assert ( + cmd.get_deep_linking_setting("scheme"), + cmd.get_deep_linking_setting("host"), + ) == ( + "myapp", + "open", + ) + # The iOS table doesn't leak to Android. + android = _deep_linking_command( + {"tool.flet.ios.deep_linking.scheme": "myapp"}, "Android" + ) + assert android.get_deep_linking_setting("scheme") is None