From 00983509d14ef7cedcd706ef7ceb3170a9822039 Mon Sep 17 00:00:00 2001 From: Armand <4831c0@proton.me> Date: Sat, 30 Aug 2025 13:55:59 +0200 Subject: [PATCH] preload app icons and bg --- .../ui/phone/screens/home/home_screen.dart | 43 +++++++++++++++++++ .../ui/phone/screens/login/login_screen.dart | 5 +-- .../screens/settings/settings_screen.dart | 19 +++++--- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/firka/lib/ui/phone/screens/home/home_screen.dart b/firka/lib/ui/phone/screens/home/home_screen.dart index 1ed1d46..ffffd2d 100644 --- a/firka/lib/ui/phone/screens/home/home_screen.dart +++ b/firka/lib/ui/phone/screens/home/home_screen.dart @@ -23,6 +23,9 @@ import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart'; import '../../../../helpers/db/widget.dart'; import '../../../../helpers/debug_helper.dart'; +import '../../../../helpers/firka_bundle.dart'; +import '../../../../helpers/image_preloader.dart'; +import '../../../widget/delayed_spinner.dart'; import '../../../widget/firka_icon.dart'; import '../../pages/extras/extras.dart'; import '../../pages/extras/main_error.dart'; @@ -74,6 +77,7 @@ class _HomeScreenState extends State { Widget? toast; bool pairingDone = false; bool _disposed = false; + bool _preloadDone = false; final RefreshController _refreshController = RefreshController(initialRefresh: false); @@ -255,6 +259,28 @@ class _HomeScreenState extends State { }); prefetch(); + _preloadImages(); + } + + Future _preloadImages() async { + final imagePaths = widget.data.settings.appIcons.keys + .map((icon) => "assets/images/icons/$icon.webp") + .toList(); + + imagePaths.add("assets/images/background.webp"); + + try { + await ImagePreloader.preloadMultipleAssets(FirkaBundle(), imagePaths); + + setState(() { + _preloadDone = true; + }); + } catch (e) { + debugPrint('Error preloading images: $e'); + setState(() { + _preloadDone = true; + }); + } } void _updateSystemUI() { @@ -300,6 +326,23 @@ class _HomeScreenState extends State { return SizedBox(); } + if (!_preloadDone) { + return Scaffold( + backgroundColor: appStyle.colors.background, + body: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox(), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [SizedBox(), DelayedSpinnerWidget(), SizedBox()], + ), + SizedBox(), + ], + ), + ); + } + if (widget.watchPair && !pairingDone) { Timer.run(() { showWearBottomSheet(context, widget.data, widget.model!); diff --git a/firka/lib/ui/phone/screens/login/login_screen.dart b/firka/lib/ui/phone/screens/login/login_screen.dart index fbef84d..591c19b 100644 --- a/firka/lib/ui/phone/screens/login/login_screen.dart +++ b/firka/lib/ui/phone/screens/login/login_screen.dart @@ -51,16 +51,13 @@ class _LoginScreenState extends State { ]; try { - // Preload with progress tracking await ImagePreloader.preloadMultipleAssets(FirkaBundle(), imagePaths); - // All images are now decoded and cached setState(() { _preloadDone = true; }); } catch (e) { - print('Error preloading images: $e'); - // Fallback: continue anyway + debugPrint('Error preloading images: $e'); setState(() { _preloadDone = true; }); diff --git a/firka/lib/ui/phone/screens/settings/settings_screen.dart b/firka/lib/ui/phone/screens/settings/settings_screen.dart index 09b33d7..a09a2e3 100644 --- a/firka/lib/ui/phone/screens/settings/settings_screen.dart +++ b/firka/lib/ui/phone/screens/settings/settings_screen.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'package:firka/helpers/db/models/app_settings_model.dart'; +import 'package:firka/helpers/image_preloader.dart'; import 'package:firka/helpers/ui/firka_button.dart'; import 'package:firka/helpers/ui/firka_card.dart'; import 'package:firka/main.dart'; @@ -234,7 +235,8 @@ class _SettingsScreenState extends State { widgets.add(Container( decoration: BoxDecoration( image: DecorationImage( - image: AssetImage('assets/images/background.webp'), + image: PreloadedImageProvider( + FirkaBundle(), ('assets/images/background.webp')), fit: BoxFit.cover), borderRadius: BorderRadius.all(Radius.circular(16)), ), @@ -248,8 +250,9 @@ class _SettingsScreenState extends State { ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(16.0)), - child: Image.asset( - "assets/images/icons/$activeIcon.webp", + child: Image( + image: PreloadedImageProvider(FirkaBundle(), + "assets/images/icons/$activeIcon.webp"), width: 74, height: 74, ), @@ -303,8 +306,9 @@ class _SettingsScreenState extends State { child: ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(12.0)), - child: Image.asset( - "assets/images/icons/$icon.webp", + child: Image( + image: PreloadedImageProvider(FirkaBundle(), + "assets/images/icons/$icon.webp"), width: 48, height: 48, ), @@ -314,8 +318,9 @@ class _SettingsScreenState extends State { : ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(16.0)), - child: Image.asset( - "assets/images/icons/$icon.webp", + child: Image( + image: PreloadedImageProvider(FirkaBundle(), + "assets/images/icons/$icon.webp"), width: 54, height: 54, ),