import 'dart:developer';
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:flutter_app_icons/flutter_app_icons.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:swift_tv/presentation/core/util/remote_config.dart';
class AndroidDynamicAppIcon {
static const String _prefKeyIcon = "last_app_icon";
static const String _prefKeyIndex = "last_app_icon_index";
static final List iconList = const [
'default',
'christmas',
'dusshera',
'ganeshchathurthi',
'navratri',
'republicday',
'diwali',
'newyear',
'pongal'
];
/// Loads the last saved icon alias, default = "default"
static Future _getLastIcon() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getString(_prefKeyIcon) ?? "default";
}
/// Persists the last selected icon alias
static Future _setLastIcon(String icon) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_prefKeyIcon, icon);
}
/// Loads the last index (default = 0)
static Future _getLastIndex() async {
final prefs = await SharedPreferences.getInstance();
return prefs.getInt(_prefKeyIndex) ?? 0;
}
/// Saves the last index
static Future _setLastIndex(int index) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setInt(_prefKeyIndex, index);
}
static Future changeAppIconAndroid() async {
if (!Platform.isAndroid) return;
final rc = RemoteConfigService.instance;
int newIndex = rc.appIconIndex % iconList.length;
String newIcon = iconList[newIndex];
// load previously active icon + index from storage
String oldIcon = await _getLastIcon();
int lastIndex = await _getLastIndex();
// if index hasn’t changed, skip
if (newIndex == lastIndex) {
log("No icon change needed. Current index = $newIndex");
return;
}
log("Switching Android app icon from $oldIcon → $newIcon");
final _flutterAppIconsPlugin = FlutterAppIcons();
try {
await _setLastIcon(newIcon);
await _setLastIndex(newIndex);
await _flutterAppIconsPlugin.setIcon(icon: newIcon, oldIcon: oldIcon);
log(
newIcon == "default" ? "Reset to default icon" : "Changed to $newIcon",
);
// save the current icon + index for next launch
// small delay to let Android system settle
// await Future.delayed(const Duration(milliseconds: 300));
// Restart.restartApp();
} on PlatformException catch (e) {
log("PlatformException while changing icon: $e");
} catch (e) {
await _setLastIcon(oldIcon);
await _setLastIndex(lastIndex);
log("Unexpected error: $e");
}
}
}
выше приведен код для динамического изменения значка приложения в приложении Android. Я получаю индекс значка из удаленной конфигурации в Firebase. Я использую пакет flutter_app_icons для динамического изменения значка приложения на основе индекса. Но приложение перезапускается, когда я меняю значок приложения. Это заставляет пользователя думать о сбое приложения. Как я могу избежать этого? Я хочу получить индекс значка приложения и запланировать его, когда пользователь закроет приложение.
static final List iconList = const [ 'default', 'christmas', 'dusshera', 'ganeshchathurthi', 'navratri', 'republicday', 'diwali', 'newyear', 'pongal' ];
/// Loads the last saved icon alias, default = "default" static Future _getLastIcon() async { final prefs = await SharedPreferences.getInstance(); return prefs.getString(_prefKeyIcon) ?? "default"; }
/// Persists the last selected icon alias static Future _setLastIcon(String icon) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString(_prefKeyIcon, icon); }
/// Loads the last index (default = 0) static Future _getLastIndex() async { final prefs = await SharedPreferences.getInstance(); return prefs.getInt(_prefKeyIndex) ?? 0; }
/// Saves the last index static Future _setLastIndex(int index) async { final prefs = await SharedPreferences.getInstance(); await prefs.setInt(_prefKeyIndex, index); }
static Future changeAppIconAndroid() async { if (!Platform.isAndroid) return;
final rc = RemoteConfigService.instance; int newIndex = rc.appIconIndex % iconList.length; String newIcon = iconList[newIndex];
// load previously active icon + index from storage String oldIcon = await _getLastIcon(); int lastIndex = await _getLastIndex();
// if index hasn’t changed, skip if (newIndex == lastIndex) { log("No icon change needed. Current index = $newIndex"); return; }
log("Switching Android app icon from $oldIcon → $newIcon");
log( newIcon == "default" ? "Reset to default icon" : "Changed to $newIcon", );
// save the current icon + index for next launch
// small delay to let Android system settle // await Future.delayed(const Duration(milliseconds: 300)); // Restart.restartApp(); } on PlatformException catch (e) { log("PlatformException while changing icon: $e"); } catch (e) { await _setLastIcon(oldIcon); await _setLastIndex(lastIndex); log("Unexpected error: $e"); } } }
[/code] выше приведен код для динамического изменения значка приложения в приложении Android. Я получаю индекс значка из удаленной конфигурации в Firebase. Я использую пакет [b]flutter_app_icons[/b] для динамического изменения значка приложения на основе индекса. Но приложение перезапускается, когда я меняю значок приложения. Это заставляет пользователя думать о сбое приложения. Как я могу избежать этого? Я хочу получить индекс значка приложения и запланировать его, когда пользователь закроет приложение.