Skip to content

Commit 424ed86

Browse files
Flet 0.27.5: app "loading" screens, Android splash customization (#5026)
* PBKDF2 iteration count increased to 600,000 Close #5023 * Added `FletApp.showAppStartupScreen` and `FletApp.appStartupScreenMessage` properties. * Added `tool.flet.splash.icon_bgcolor` and `tool.flet.splash.icon_dark_bgcolor` settings for Android splash screen icon image * Changed loading screen bgcolor * Add FletApp controls props: `show_app_startup_screen` and `app_startup_screen_message`
1 parent 83d73ce commit 424ed86

File tree

11 files changed

+108
-27
lines changed

11 files changed

+108
-27
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Flet changelog
22

3+
## 0.27.5
4+
5+
* Added `FletApp.showAppStartupScreen` and `FletApp.appStartupScreenMessage` properties.
6+
* Added `tool.flet.splash.icon_bgcolor` and `tool.flet.splash.icon_dark_bgcolor` settings for Android splash screen icon image.
7+
* Added `tool.flet.app.boot_screen` and `tool.flet.app.startup_screen` settings for customizing Flet app "loading" screens.
8+
* feat: `Dropdown.menu_width` property ([#5007](https://github.com/flet-dev/flet/issues/5007))
9+
* PBKDF2 iteration count increased to 600,000 ([#5023](https://github.com/flet-dev/flet/issues/5023))
10+
311
## 0.27.4
412

513
* Fix: do not remove `flutter-packages` on re-build if `dev_packages` configured.

packages/flet/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
# 0.27.5
2+
3+
* Added `FletApp.showAppStartupScreen` and `FletApp.appStartupScreenMessage` properties.
4+
* Added `tool.flet.splash.icon_bgcolor` and `tool.flet.splash.icon_dark_bgcolor` settings for Android splash screen icon image.
5+
* Added `tool.flet.app.boot_screen` and `tool.flet.app.startup_screen` settings for customizing Flet app "loading" screens.
6+
* feat: `Dropdown.menu_width` property ([#5007](https://github.com/flet-dev/flet/issues/5007))
7+
* PBKDF2 iteration count increased to 600,000 ([#5023](https://github.com/flet-dev/flet/issues/5023))
8+
19
# 0.27.4
210

311
* Fix: do not remove `flutter-packages` on re-build if `dev_packages` configured.

packages/flet/lib/src/controls/flet_app_control.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,18 @@ class _FletAppControlState extends State<FletAppControl> {
2727
var url = widget.control.attrString("url", "")!;
2828
var reconnectIntervalMs = widget.control.attrInt("reconnectIntervalMs");
2929
var reconnectTimeoutMs = widget.control.attrInt("reconnectTimeoutMs");
30+
var showAppStartupScreen = widget.control.attrBool("showAppStartupScreen");
31+
var appStartupScreenMessage =
32+
widget.control.attrString("appStartupScreenMessage");
3033

3134
return constrainedControl(
3235
context,
3336
FletApp(
3437
controlId: widget.control.id,
3538
reconnectIntervalMs: reconnectIntervalMs,
3639
reconnectTimeoutMs: reconnectTimeoutMs,
40+
showAppStartupScreen: showAppStartupScreen,
41+
appStartupScreenMessage: appStartupScreenMessage,
3742
pageUrl: url,
3843
assetsDir: "",
3944
errorsHandler: _errorsHandler,

packages/flet/lib/src/controls/page.dart

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -697,25 +697,29 @@ class _PageControlState extends State<PageControl> with FletStoreMixin {
697697
builder: (context, routesView) {
698698
debugPrint("_buildNavigator build");
699699

700-
var hideLoadingPage =
701-
FletAppServices.of(context).hideLoadingPage ?? false;
700+
var showAppStartupScreen =
701+
FletAppServices.of(context).showAppStartupScreen ?? false;
702+
var appStartupScreenMessage =
703+
FletAppServices.of(context).appStartupScreenMessage ?? "";
702704

703705
List<Page<dynamic>> pages = [];
704706
if (routesView.views.isEmpty) {
705707
pages.add(AnimatedTransitionPage(
706708
fadeTransition: true,
707709
duration: Duration.zero,
708-
child: hideLoadingPage
709-
? const Scaffold(
710-
body: PageMedia(),
711-
)
712-
: Stack(children: [
710+
child: showAppStartupScreen
711+
? Stack(children: [
713712
const PageMedia(),
714713
LoadingPage(
715714
isLoading: routesView.isLoading,
716-
message: routesView.error,
715+
message: routesView.isLoading
716+
? appStartupScreenMessage
717+
: routesView.error,
717718
)
718-
])));
719+
])
720+
: const Scaffold(
721+
body: PageMedia(),
722+
)));
719723
} else {
720724
Widget? loadingPage;
721725
// offstage
@@ -739,10 +743,12 @@ class _PageControlState extends State<PageControl> with FletStoreMixin {
739743
}
740744

741745
if ((routesView.isLoading || routesView.error != "") &&
742-
!hideLoadingPage) {
746+
showAppStartupScreen) {
743747
loadingPage = LoadingPage(
744748
isLoading: routesView.isLoading,
745-
message: routesView.error,
749+
message: routesView.isLoading
750+
? appStartupScreenMessage
751+
: routesView.error,
746752
);
747753
}
748754

packages/flet/lib/src/flet_app.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import 'flet_app_services.dart';
88
class FletApp extends StatefulWidget {
99
final String pageUrl;
1010
final String assetsDir;
11-
final bool? hideLoadingPage;
11+
final bool? showAppStartupScreen;
12+
final String? appStartupScreenMessage;
1213
final String? controlId;
1314
final String? title;
1415
final FletAppErrorsHandler? errorsHandler;
@@ -20,7 +21,8 @@ class FletApp extends StatefulWidget {
2021
{super.key,
2122
required this.pageUrl,
2223
required this.assetsDir,
23-
this.hideLoadingPage,
24+
this.showAppStartupScreen,
25+
this.appStartupScreenMessage,
2426
this.controlId,
2527
this.title,
2628
this.errorsHandler,
@@ -48,7 +50,8 @@ class _FletAppState extends State<FletApp> {
4850
_pageUrl = widget.pageUrl;
4951
_appServices = FletAppServices(
5052
parentAppServices: FletAppServices.maybeOf(context),
51-
hideLoadingPage: widget.hideLoadingPage,
53+
showAppStartupScreen: widget.showAppStartupScreen,
54+
appStartupScreenMessage: widget.appStartupScreenMessage,
5255
controlId: widget.controlId,
5356
reconnectIntervalMs: widget.reconnectIntervalMs,
5457
reconnectTimeoutMs: widget.reconnectTimeoutMs,

packages/flet/lib/src/flet_app_services.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import 'reducers.dart';
1111

1212
class FletAppServices extends InheritedWidget {
1313
final FletAppServices? parentAppServices;
14-
final bool? hideLoadingPage;
14+
final bool? showAppStartupScreen;
15+
final String? appStartupScreenMessage;
1516
final String? controlId;
1617
final int? reconnectIntervalMs;
1718
final int? reconnectTimeoutMs;
@@ -31,7 +32,8 @@ class FletAppServices extends InheritedWidget {
3132
required this.assetsDir,
3233
this.errorsHandler,
3334
this.parentAppServices,
34-
this.hideLoadingPage,
35+
this.showAppStartupScreen,
36+
this.appStartupScreenMessage,
3537
this.controlId,
3638
this.reconnectIntervalMs,
3739
this.reconnectTimeoutMs,

packages/flet/lib/src/widgets/loading_page.dart

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ class LoadingPage extends StatelessWidget {
44
final bool isLoading;
55
final String message;
66

7-
const LoadingPage({super.key, required this.isLoading, required this.message});
7+
const LoadingPage(
8+
{super.key, required this.isLoading, required this.message});
89

910
@override
1011
Widget build(BuildContext context) {
@@ -24,7 +25,7 @@ class LoadingPage extends StatelessWidget {
2425
];
2526
if (message != "") {
2627
children.addAll([
27-
const SizedBox(height: 8),
28+
const SizedBox(height: 10),
2829
Text(
2930
message,
3031
style: Theme.of(context).textTheme.bodySmall,
@@ -63,7 +64,7 @@ class LoadingPage extends StatelessWidget {
6364
backgroundColor: Colors.transparent,
6465
body: Container(
6566
alignment: Alignment.center,
66-
color: theme.colorScheme.surface.withOpacity(0.7),
67+
color: theme.colorScheme.surface,
6768
child: child),
6869
);
6970
}

packages/flet/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: flet
22
description: Write entire Flutter app in Python or add server-driven UI experience into existing Flutter app.
33
homepage: https://flet.dev
44
repository: https://github.com/flet-dev/flet/packages/flet
5-
version: 0.27.4
5+
version: 0.27.5
66

77
# This package supports all platforms listed below.
88
platforms:

sdk/python/packages/flet-cli/src/flet_cli/commands/build.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,6 +1141,7 @@ def setup_template_data(self):
11411141
"ios_team_id": ios_team_id,
11421142
"options": {
11431143
"package_platform": self.package_platform,
1144+
"config_platform": self.config_platform,
11441145
"target_arch": (
11451146
target_arch
11461147
if isinstance(target_arch, list)
@@ -1586,21 +1587,44 @@ def customize_splash_images(self):
15861587
)
15871588

15881589
# splash colors
1589-
splash_color = self.options.splash_color or self.get_pyproject(
1590-
"tool.flet.splash.color"
1590+
splash_color = (
1591+
self.options.splash_color
1592+
or self.get_pyproject(f"tool.flet.{self.config_platform}.splash.color")
1593+
or self.get_pyproject("tool.flet.splash.color")
15911594
)
15921595
if splash_color:
15931596
pubspec["flutter_native_splash"]["color"] = splash_color
15941597
pubspec["flutter_native_splash"]["android_12"]["color"] = splash_color
1595-
splash_dark_color = self.options.splash_dark_color or self.get_pyproject(
1596-
"tool.flet.splash.dark_color"
1598+
1599+
splash_dark_color = (
1600+
self.options.splash_dark_color
1601+
or self.get_pyproject(f"tool.flet.{self.config_platform}.splash.dark_color")
1602+
or self.get_pyproject("tool.flet.splash.dark_color")
15971603
)
15981604
if splash_dark_color:
15991605
pubspec["flutter_native_splash"]["color_dark"] = splash_dark_color
16001606
pubspec["flutter_native_splash"]["android_12"][
16011607
"color_dark"
16021608
] = splash_dark_color
16031609

1610+
splash_icon_bgcolor = self.get_pyproject(
1611+
f"tool.flet.{self.config_platform}.splash.icon_bgcolor"
1612+
) or self.get_pyproject("tool.flet.splash.icon_bgcolor")
1613+
1614+
if splash_icon_bgcolor:
1615+
pubspec["flutter_native_splash"]["android_12"][
1616+
"icon_background_color"
1617+
] = splash_icon_bgcolor
1618+
1619+
splash_icon_dark_bgcolor = self.get_pyproject(
1620+
f"tool.flet.{self.config_platform}.splash.icon_dark_bgcolor"
1621+
) or self.get_pyproject("tool.flet.splash.icon_dark_bgcolor")
1622+
1623+
if splash_icon_dark_bgcolor:
1624+
pubspec["flutter_native_splash"]["android_12"][
1625+
"icon_background_color_dark"
1626+
] = splash_icon_dark_bgcolor
1627+
16041628
# enable/disable splashes
16051629
pubspec["flutter_native_splash"]["web"] = (
16061630
not self.options.no_web_splash
@@ -1784,8 +1808,10 @@ def package_python_app(self):
17841808
# exclude
17851809
exclude_list = ["build"]
17861810

1787-
app_exclude = self.options.exclude or self.get_pyproject(
1788-
"tool.flet.app.exclude"
1811+
app_exclude = (
1812+
self.options.exclude
1813+
or self.get_pyproject(f"tool.flet.{self.config_platform}.app.exclude")
1814+
or self.get_pyproject("tool.flet.app.exclude")
17891815
)
17901816
if app_exclude:
17911817
exclude_list.extend(app_exclude)

sdk/python/packages/flet/src/flet/core/flet_app.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ def __init__(
2020
url: Optional[str] = None,
2121
reconnect_interval_ms: Optional[int] = None,
2222
reconnect_timeout_ms: Optional[int] = None,
23+
show_app_startup_screen: Optional[bool] = None,
24+
app_startup_screen_message: Optional[str] = None,
2325
on_error: OptionalControlEventCallable = None,
2426
#
2527
# ConstrainedControl
@@ -84,6 +86,8 @@ def __init__(
8486
self.url = url
8587
self.reconnect_interval_ms = reconnect_interval_ms
8688
self.reconnect_timeout_ms = reconnect_timeout_ms
89+
self.show_app_startup_screen = show_app_startup_screen
90+
self.app_startup_screen_message = app_startup_screen_message
8791
self.on_error = on_error
8892

8993
def _get_control_name(self):
@@ -116,6 +120,24 @@ def reconnect_timeout_ms(self) -> Optional[int]:
116120
def reconnect_timeout_ms(self, value: Optional[int]):
117121
self._set_attr("reconnectTimeoutMs", value)
118122

123+
# show_app_startup_screen
124+
@property
125+
def show_app_startup_screen(self) -> bool:
126+
return self._get_attr("showAppStartupScreen", data_type="bool", def_value=False)
127+
128+
@show_app_startup_screen.setter
129+
def show_app_startup_screen(self, value: Optional[bool]):
130+
self._set_attr("showAppStartupScreen", value)
131+
132+
# app_startup_screen_message
133+
@property
134+
def app_startup_screen_message(self) -> Optional[str]:
135+
return self._get_attr("appStartupScreenMessage")
136+
137+
@app_startup_screen_message.setter
138+
def app_startup_screen_message(self, value: Optional[str]):
139+
self._set_attr("appStartupScreenMessage", value)
140+
119141
# on_error
120142
@property
121143
def on_error(self) -> OptionalControlEventCallable:

sdk/python/packages/flet/src/flet/security/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def __generate_fernet_key(secret_key: str) -> bytes:
1717

1818

1919
def __generate_fernet_key_kdf(secret_key: str, salt: bytes) -> bytes:
20-
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt, iterations=100000)
20+
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=salt, iterations=600000)
2121
return base64.urlsafe_b64encode(kdf.derive(secret_key.encode("utf-8")))
2222

2323

0 commit comments

Comments
 (0)