Flutter动态应用图标插件variable_app_icon的使用
Flutter动态应用图标插件variable_app_icon的使用
variable_app_icon
是一个Flutter插件,允许在Android和iOS上使用多个应用图标。以下是如何设置和使用这个插件的详细步骤。
Getting Started
添加依赖
首先,在pubspec.yaml
文件中添加variable_app_icon
作为依赖项:
dependencies:
variable_app_icon: ^0.0.1
然后运行flutter pub get
来获取新添加的依赖项。
Usage
1. 设置应用图标(Android)
将你的应用图标放入mipmap文件夹中。然后在AndroidManifest.xml
中为每个图标添加如下配置:
<!-- Use this for each icon -->
<activity-alias
android:name="appicon.DEFAULT" <!-- 这里是你的图标ID,可以是任何内容,但至少要包含一个点 -->
android:enabled="true" <!-- 将默认图标设置为true,其他设置为false -->
android:exported="true"
android:icon="@mipmap/ic_launcher" <!-- 图标位置 -->
android:label="variable_app_icon_example"
android:targetActivity=".MainActivity"> <!-- 主活动 -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
移除application
标签中的label
和icon
属性。
从主活动的<intent-filter>
中移除<category android:name="android.intent.category.LAUNCHER" />
。
2. 设置应用图标(iOS)
打开你的iOS项目(即Runner)在Xcode中,然后前往Build Settings标签。 现在搜索图标,你会找到Assets Catalog Compiler Options。将Include All App Icon Assets设置为Yes。 然后将所有图标的名称添加到Alternate App Icon Sets。
3. 在Flutter侧的操作
在main
函数中设置这两个变量:
VariableAppIcon.iOSDefaultAppIcon = iosAppIcons[0]; // 默认iOS图标
VariableAppIcon.androidAppIconIds = androidIconIds; // 所有安卓图标ID,这是你在`AndroidManifest.xml`文件中指定的android:name,例如 ["appicon.DEFAULT", others]
调用此方法更改应用图标:
await VariableAppIcon.changeAppIcon(
androidIconId: "appicon.TEAL",
iosIcon: "AppIcon2");
查看示例应用程序以获取完整示例。
Demo
Android
iOS
Support the package (optional)
如果你觉得这个包有用,可以通过给它加星来支持它。
Credits
这个包是由Shahriar Nasim Nafi创建的。
示例代码
下面是一个完整的示例demo,展示了如何使用variable_app_icon
插件更改应用图标:
import 'dart:io';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:variable_app_icon/variable_app_icon.dart';
const List<String> iosAppIcons = ["AppIcon", "AppIcon2", "AppIcon3"];
const List<String> androidIconIds = ["appicon.DEFAULT", "appicon.TEAL", "appicon.ORANGE"];
void main() {
VariableAppIcon.iOSDefaultAppIcon = iosAppIcons[0];
VariableAppIcon.androidAppIconIds = androidIconIds;
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
int currentIconIndex = 0;
@override
void initState() {
super.initState();
loadCurrentIcon();
}
Future<void> loadCurrentIcon() async {
final prefs = await SharedPreferences.getInstance();
final index = prefs.getInt("currentIconIndex") ?? currentIconIndex;
setState(() {
currentIconIndex = index;
});
}
Future<void> changeIcon(int? value) async {
final prefs = await SharedPreferences.getInstance();
await prefs.setInt("currentIconIndex", value!);
print(value);
setState(() {
currentIconIndex = value;
});
await VariableAppIcon.changeAppIcon(
androidIconId: androidIconIds[currentIconIndex],
iosIcon: iosAppIcons[currentIconIndex]);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin Example App'),
),
body: Center(
child: DropdownButton<int>(
value: currentIconIndex,
items: [0, 1, 2]
.map((index) => DropdownMenuItem<int>(
value: index,
child: Text(Platform.isAndroid
? androidIconIds[index]
: iosAppIcons[index]),
))
.toList(),
onChanged: changeIcon,
),
),
),
);
}
}
通过上述步骤和示例代码,你可以轻松地在Flutter项目中实现动态应用图标的功能。希望这对你有所帮助!
更多关于Flutter动态应用图标插件variable_app_icon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter动态应用图标插件variable_app_icon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用 variable_app_icon
插件在 Flutter 中实现动态应用图标的示例代码。variable_app_icon
插件允许你在运行时更改应用图标。
首先,你需要在你的 pubspec.yaml
文件中添加该插件依赖:
dependencies:
flutter:
sdk: flutter
variable_app_icon: ^x.y.z # 请替换为最新版本号
然后,运行 flutter pub get
来获取依赖。
接下来,你需要按照以下步骤配置你的项目:
-
配置 Android 项目:
-
在
android/app/src/main/AndroidManifest.xml
中,确保你的application
标签包含以下属性:<application ... android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApp"> ... </application>
-
在
android/app/src/main/res/
目录下,创建或确认存在mipmap-anydpi-v26
文件夹,并在其中放置你的不同图标资源。例如:android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
这些 XML 文件应该引用你的动态图标资源,例如:
<!-- ic_launcher.xml --> <adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> <background android:drawable="@drawable/ic_background"/> <foreground android:drawable="@drawable/ic_foreground"/> </adaptive-icon>
ic_background
和ic_foreground
是你放置在res/drawable
目录下的矢量图资源。
-
-
在 Flutter 中使用
variable_app_icon
插件:import 'package:flutter/material.dart'; import 'package:variable_app_icon/variable_app_icon.dart'; void main() { runApp(MyApp()); } class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { @override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Dynamic App Icon Example'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ ElevatedButton( onPressed: () async { // 假设你有一个名为 'new_icon' 的图标资源 await VariableAppIcon.setAppIcon( androidIconName: 'new_icon', // 确保这个名称与你的资源匹配 iosIconNames: ['new_icon'], // iOS 支持多个尺寸,这里仅为示例 ); }, child: Text('Change App Icon'), ), ], ), ), ), ); } }
注意:
- 在 Android 上,
androidIconName
应该对应放置在mipmap-anydpi-v26
目录中的 XML 文件的名称(不带扩展名)。 - 在 iOS 上,由于应用图标的复杂性,你可能需要为每个图标尺寸单独设置资源,并在
Info.plist
中进行相应配置。variable_app_icon
插件在 iOS 上的支持可能有限,通常需要手动配置更多内容。
- 在 Android 上,
-
iOS 额外配置(简要说明):
- 将你的图标资源添加到 Xcode 项目中。
- 在
Info.plist
中,为每个可能的图标尺寸添加CFBundleIcons
配置。 - 由于 iOS 的限制,动态更改应用图标通常需要重启应用或用户手动操作,插件可能无法完全自动化这一过程。
请注意,动态更改应用图标功能在某些平台上可能受到限制,特别是在 iOS 上。务必在目标平台上进行充分测试,以确保该功能按预期工作。