在Flutter中制作App图标插件,可以通过创建插件包实现动态修改应用图标的功能。以下是具体步骤和代码示例:
1. 创建Flutter插件
flutter create --template=plugin app_icon_changer
2. Android端实现 (AndroidManifest.xml)
在android/src/main/AndroidManifest.xml中预定义备用图标:
<activity android:name=".MainActivity"
android:launchMode="singleTop">
<activity-alias
android:name=".MainActivityAlias1"
android:enabled="false"
android:icon="@mipmap/ic_alternate1"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
</activity>
3. Android原生代码 (AppIconChangerPlugin.java)
public class AppIconChangerPlugin implements MethodCallHandler {
private final Activity activity;
private void changeIcon(String aliasName) {
PackageManager pm = activity.getPackageManager();
pm.setComponentEnabledSetting(
new ComponentName(activity, "com.example.app_icon_changer.MainActivity"),
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP
);
pm.setComponentEnabledSetting(
new ComponentName(activity, aliasName),
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP
);
}
}
4. iOS端实现 (AppIconChangerPlugin.m)
+ (void)changeIcon:(NSString *)iconName {
if (![[UIApplication sharedApplication] supportsAlternateIcons]) {
return;
}
[[UIApplication sharedApplication] setAlternateIconName:iconName completionHandler:nil];
}
5. Dart接口 (lib/app_icon_changer.dart)
class AppIconChanger {
static const MethodChannel _channel =
MethodChannel('app_icon_changer');
static Future<void> changeIcon(String iconName) async {
try {
await _channel.invokeMethod('changeIcon', {'iconName': iconName});
} on PlatformException catch (e) {
print("Failed to change icon: '${e.message}'");
}
}
}
6. 使用方式
AppIconChanger.changeIcon('MainActivityAlias1'); // Android
AppIconChanger.changeIcon('AlternateIcon'); // iOS
注意事项:
- iOS限制:需要先在
Info.plist中预定义备用图标
- 平台差异:Android通过Activity-Alias实现,iOS使用原生API
- 上架政策:动态修改图标可能违反应用商店政策,需谨慎使用
建议测试时重点关注不同Android厂商的兼容性,某些定制系统可能限制此功能。