Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.<platform>.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.
Expand Down
45 changes: 26 additions & 19 deletions sdk/python/packages/flet-cli/src/flet_cli/commands/build_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.<platform>.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}")
Comment on lines +2961 to +2968

def get_platform_setting(self, pyproj_setting, default_value=None):
"""
Resolve a pyproject setting with precedence: platform, global, default.
Expand Down
56 changes: 56 additions & 0 deletions sdk/python/packages/flet-cli/tests/test_build_platform_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading