0.27.4 Android splash and Loading screen (#43)

* Remove splash colors for Android 12

* Set icon_background_color

* Remove icon_background_color

* Splash Screen test

* Fix if

* Splash screen

* get_config_platform()

* Fix package_platform

* Platform-specific splash_screen

* Added trim

* splash_screen_text

* Fix condition

* hide_loading_animation: false

* loading_screen

* Test get_pyproject()

* Declare get_pyproject

* Test my_custom_function

* Test foobar filter

* Fix splash_screen

* Test greeter

* Test context aware function

* Fix get_pyproject

* Remove macros

* Test boot and startup screens

* Fix appBootScreenMessage

* Fix show setting

* Cleanup
This commit is contained in:
Feodor Fitsner 2025-03-04 13:52:49 -08:00 committed by GitHub
parent f063f13aca
commit e738dd0c87
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 88 additions and 37 deletions

View File

@ -10,7 +10,6 @@
"copyright": "Copyright (c) 2023 Your Company", "copyright": "Copyright (c) 2023 Your Company",
"flutter": null, "flutter": null,
"sep": "/", "sep": "/",
"hide_loading_animation": true,
"bundle_id": "{{ cookiecutter.bundle_id if 'bundle_id' in cookiecutter else cookiecutter.org_name + '.' + cookiecutter.project_name_slug }}", "bundle_id": "{{ cookiecutter.bundle_id if 'bundle_id' in cookiecutter else cookiecutter.org_name + '.' + cookiecutter.project_name_slug }}",
"org_name_2": "{{ cookiecutter.bundle_id.rsplit('.', 1)[0] if 'bundle_id' in cookiecutter else cookiecutter.org_name if 'org_name' in cookiecutter else 'com.flet' }}", "org_name_2": "{{ cookiecutter.bundle_id.rsplit('.', 1)[0] if 'bundle_id' in cookiecutter else cookiecutter.org_name if 'org_name' in cookiecutter else 'com.flet' }}",
"ios_provisioning_profile": "", "ios_provisioning_profile": "",
@ -28,5 +27,6 @@
"pwa_theme_color": "#0175C2", "pwa_theme_color": "#0175C2",
"split_per_abi": false, "split_per_abi": false,
"options": null, "options": null,
"pyproject": null "pyproject": null,
"_extensions": ["cookiecutter_extensions.FletExtension"]
} }

View File

@ -0,0 +1,22 @@
from jinja2 import pass_context
from jinja2.ext import Extension
class FletExtension(Extension):
def __init__(self, environment):
super(FletExtension, self).__init__(environment)
environment.globals["get_pyproject"] = self.get_pyproject
@pass_context
def get_pyproject(self, context, setting):
pyproject = context.get("cookiecutter", {}).get("pyproject", {})
if not setting:
return pyproject
d = pyproject
for k in setting.split("."):
d = d.get(k)
if d is None:
return None
return d

View File

@ -1,16 +0,0 @@
{# _macros.jinja2 #}
{% macro get_value(dict, path) %}
{# Split the path into keys #}
{% set keys = path.split('.') %}
{% if keys and dict is mapping and keys[0] in dict %}
{% set next_value = dict[keys[0]] %}
{% if keys | length == 1 %}
{{ next_value }}
{% else %}
{{ get_value(next_value, keys[1:] | join('.')) }}
{% endif %}
{% else %}
{{ "" }}
{% endif %}
{% endmacro %}

View File

@ -1,4 +1,3 @@
{% import "_macros.jinja2" as macros %}
plugins { plugins {
id "com.android.application" id "com.android.application"
id "kotlin-android" id "kotlin-android"
@ -50,8 +49,8 @@ android {
main.java.srcDirs += 'src/main/kotlin' main.java.srcDirs += 'src/main/kotlin'
} }
{% set min_sdk_version = macros.get_value(cookiecutter.pyproject, "tool.flet.android.min_sdk_version") | trim %} {% set min_sdk_version = get_pyproject("tool.flet.android.min_sdk_version") %}
{% set target_sdk_version = macros.get_value(cookiecutter.pyproject, "tool.flet.android.target_sdk_version") | trim %} {% set target_sdk_version = get_pyproject("tool.flet.android.target_sdk_version") %}
defaultConfig { defaultConfig {
applicationId "{{ cookiecutter.org_name_2 }}.{{ cookiecutter.package_name }}" applicationId "{{ cookiecutter.org_name_2 }}.{{ cookiecutter.package_name }}"

View File

@ -14,6 +14,25 @@ import 'package:window_manager/window_manager.dart';
import "python.dart"; import "python.dart";
/*
{% set show_boot_screen = get_pyproject("tool.flet." ~ cookiecutter.options.config_platform ~ ".app.boot_screen.show")
or get_pyproject("tool.flet.app.boot_screen.show")
or False %}
{% set boot_screen_message = get_pyproject("tool.flet." ~ cookiecutter.options.config_platform ~ ".app.boot_screen.message")
or get_pyproject("tool.flet.app.boot_screen.message") %}
{% set show_startup_screen = get_pyproject("tool.flet." ~ cookiecutter.options.config_platform ~ ".app.startup_screen.show")
or get_pyproject("tool.flet.app.startup_screen.show")
or False %}
{% set startup_screen_message = get_pyproject("tool.flet." ~ cookiecutter.options.config_platform ~ ".app.startup_screen.message")
or get_pyproject("tool.flet.app.startup_screen.message") %}
show_boot_screen: {{ show_boot_screen }}
boot_screen_message: {{ boot_screen_message }}
show_startup_screen: {{ show_startup_screen }}
startup_screen_message: {{ startup_screen_message }}
*/
{% for dep in cookiecutter.flutter.dependencies %} {% for dep in cookiecutter.flutter.dependencies %}
import 'package:{{ dep }}/{{ dep }}.dart' as {{ dep }}; import 'package:{{ dep }}/{{ dep }}.dart' as {{ dep }};
{% endfor %} {% endfor %}
@ -22,9 +41,10 @@ const bool isProduction = bool.fromEnvironment('dart.vm.product');
const assetPath = "app/app.zip"; const assetPath = "app/app.zip";
const pythonModuleName = "{{ cookiecutter.python_module_name }}"; const pythonModuleName = "{{ cookiecutter.python_module_name }}";
final hideLoadingPage = final showAppBootScreen = bool.tryParse("{{ show_boot_screen }}".toLowerCase()) ?? false;
bool.tryParse("{{ cookiecutter.hide_loading_animation }}".toLowerCase()) ?? const appBootScreenMessage = '{{ boot_screen_message | default("Preparing the app for its first launch…", true) }}';
true; final showAppStartupScreen = bool.tryParse("{{ show_startup_screen }}".toLowerCase()) ?? false;
const appStartupScreenMessage = '{{ startup_screen_message | default("Getting things ready…", true) }}';
List<CreateControlFactory> createControlFactories = [ List<CreateControlFactory> createControlFactories = [
{% for dep in cookiecutter.flutter.dependencies %} {% for dep in cookiecutter.flutter.dependencies %}
@ -53,7 +73,8 @@ void main(List<String> args) async {
? FletApp( ? FletApp(
pageUrl: pageUrl, pageUrl: pageUrl,
assetsDir: assetsDir, assetsDir: assetsDir,
hideLoadingPage: hideLoadingPage, showAppStartupScreen: showAppStartupScreen,
appStartupScreenMessage: appStartupScreenMessage,
createControlFactories: createControlFactories) createControlFactories: createControlFactories)
: FutureBuilder( : FutureBuilder(
future: runPythonApp(args), future: runPythonApp(args),
@ -71,7 +92,8 @@ void main(List<String> args) async {
return FletApp( return FletApp(
pageUrl: pageUrl, pageUrl: pageUrl,
assetsDir: assetsDir, assetsDir: assetsDir,
hideLoadingPage: hideLoadingPage, showAppStartupScreen: showAppStartupScreen,
appStartupScreenMessage: appStartupScreenMessage,
createControlFactories: createControlFactories); createControlFactories: createControlFactories);
} }
}); });
@ -83,7 +105,7 @@ void main(List<String> args) async {
text: snapshot.error.toString())); text: snapshot.error.toString()));
} else { } else {
// loading // loading
return const MaterialApp(home: BlankScreen()); return MaterialApp(home: showAppBootScreen ? const BootScreen() : const BlankScreen());
} }
})); }));
} }
@ -294,6 +316,34 @@ class ErrorScreen extends StatelessWidget {
} }
} }
class BootScreen extends StatelessWidget {
const BootScreen({
super.key,
});
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(
width: 30,
height: 30,
child: CircularProgressIndicator(strokeWidth: 3),
),
const SizedBox(
height: 10,
),
Text(appBootScreenMessage, style: Theme.of(context).textTheme.bodySmall,)
],
),
),
);
}
}
class BlankScreen extends StatelessWidget { class BlankScreen extends StatelessWidget {
const BlankScreen({ const BlankScreen({
super.key, super.key,

View File

@ -21,13 +21,13 @@ dependencies:
window_manager: ^0.4.3 window_manager: ^0.4.3
dependency_overrides: dependency_overrides:
flet: 0.27.4 #flet: 0.27.4
# flet: flet:
# git: git:
# path: packages/flet path: packages/flet
# ref: main ref: feodor/flet-0-27-5-fixes
# url: https://github.com/flet-dev/flet.git url: https://github.com/flet-dev/flet.git
# serious_python: # serious_python:
# git: # git:
@ -121,14 +121,10 @@ flutter_native_splash:
# 768 pixels in diameter. # 768 pixels in diameter.
image: "images/icon.png" image: "images/icon.png"
# Splash screen background color.
color: "#ffffff"
# The image_dark, color_dark, icon_background_color_dark, and branding_dark set values that # The image_dark, color_dark, icon_background_color_dark, and branding_dark set values that
# apply when the device is in dark mode. If they are not specified, the app will use the # apply when the device is in dark mode. If they are not specified, the app will use the
# parameters from above. # parameters from above.
image_dark: "images/icon.png" image_dark: "images/icon.png"
color_dark: "#333333"
# The android, ios and web parameters can be used to disable generating a splash screen on a given # The android, ios and web parameters can be used to disable generating a splash screen on a given
# platform. # platform.