fix: смена иконки через нативный MethodChannel — без плагина и без отключения MainActivity
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user