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:
parent
f063f13aca
commit
e738dd0c87
|
|
@ -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"]
|
||||||
}
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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 %}
|
|
||||||
|
|
@ -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 }}"
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue