fix: смена иконки через нативный MethodChannel — без плагина и без отключения MainActivity

This commit is contained in:
klockky
2026-05-28 05:13:14 +00:00
parent b35626e36a
commit eb159de0f4
7 changed files with 101 additions and 21 deletions
+9 -7
View File
@@ -1,23 +1,25 @@
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter_dynamic_icon_plus/flutter_dynamic_icon_plus.dart';
import 'package:flutter/services.dart';
import 'package:shared_preferences/shared_preferences.dart';
enum AppIcon {
defaultIcon('default', 'Default', 'assets/komet_icon.png', null),
defaultIcon('default', 'Default', 'assets/komet_icon.png', 'DefaultIcon'),
minimal('minimal', 'Minimal', 'assets/meteor_icon.png', 'MinimalIcon');
final String id;
final String title;
final String previewAsset;
final String? platformName;
final String platformName;
const AppIcon(this.id, this.title, this.previewAsset, this.platformName);
}
class AppIconConfig {
static const prefKey = 'app_icon';
static const _channel = MethodChannel('ru.komet.app/app_icon');
static final ValueNotifier<AppIcon> current = ValueNotifier(
AppIcon.defaultIcon,
);
@@ -34,12 +36,12 @@ class AppIconConfig {
static Future<void> apply(AppIcon icon) async {
if (!isSupported) return;
if (current.value == icon) return;
await FlutterDynamicIconPlus.setAlternateIconName(
iconName: icon.platformName,
);
current.value = icon;
final prefs = await SharedPreferences.getInstance();
await prefs.setString(prefKey, icon.id);
current.value = icon;
await _channel.invokeMethod<void>('setAppIcon', {
'name': icon.platformName,
});
}
static AppIcon _parse(String? val) {
@@ -74,7 +74,7 @@ class _AppIconScreenState extends State<AppIconScreen> {
const SizedBox(height: 4),
Text(
AppIconConfig.isSupported
? 'Изменение применится сразу — приложение может ненадолго закрыться'
? 'На Android приложение закроется — лаунчер подхватит новую иконку. На iOS — мгновенно с системным диалогом.'
: 'Доступно только на Android и iOS',
style: TextStyle(
color: cs.onSurfaceVariant,