Flutter实现动态更换APPIcon需要在iOS和Android平台上实现不同的方式。下面分别介绍。
iOS:
在Xcode中,打开项目,选择"Runner" Target。
在"Runner"目录下,新建一个名为"AppIcon"的文件夹。在该文件夹下,可以添加多个具有不同大小的图片,用作AppIcon。
在"Info.plist"文件中,添加一个"CFBundleAlternateIcons"键值对,值为一个字典。在字典中,可以设置不同的IconName和IconFiles。例如:
<key>CFBundleAlternateIcons</key>
<dict>
<key>Icon1</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>AppIcon/icon1.png</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>Icon2</key>
<dict>
<key>CFBundleIconFiles</key>
<array>
<string>AppIcon/icon2.png</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
</dict>
其中,Icon1和Icon2是不同的IconName,icon1.png和icon2.png是在AppIcon目录下的两个不同大小的图片。
- 在Flutter中,可以通过调用flutter_launcher_icons插件生成不同大小的图片,并存放在AppIcon目录下。例如:
flutter pub run flutter_launcher_icons:main
执行以上命令后,会在项目根目录生成一个flutter_launcher_icons_config.yaml文件,可以在该文件中配置不同大小的Icon。例如:
flutter_icons:
android: "launcher_icon"
ios: true
image_path_ios: "AppIcon/icon_%SIZE%.png"
image_path_android: "res/mipmap-%SIZE%/"
image_path_web: "icons/"
adaptive_icon_background: "#000000"
adaptive_icon_foreground: "assets/icon/icon_foreground.png"
adaptive_icon_maskable: true
其中,image_path_ios为AppIcon的路径,通过%SIZE%变量,可以生成不同大小的Icon。
- 在Flutter中,可以使用flutter_platform_widgets插件,根据不同的平台切换AppIcon。例如:
PlatformIconButton(
androidIcon: Icon(FontAwesomeIcons.circle),
androidPlainIcon: Icon(Icons.circle),
iosIcon: Icon(FontAwesomeIcons.circle),
onPressed: () async {
if (await canSetIcons()) {
print('可以更换Icon');
setIcon(iconName: 'Icon1'); // 更换Icon
} else {
print('不支持更换Icon');
}
},
)
在onPressed回调函数中调用setIcon函数,可以在运行时更换AppIcon。
Android:
- 在AndroidManifest.xml文件中,可以定义多个Launcher Activity,通过该方式切换AppIcon。例如:
<activity android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".MainActivity2"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<meta-data
android:name="android.app.shortcuts"
android:resource="@xml/shortcuts"/>
</activity>
这里定义了两个Activity,分别为MainActivity和MainActivity2。其中,MainActivity为默认的启动Activity,而MainActivity2则通过intent-filter和meta-data设置为Launcher Activity。
- 在Flutter中,可以使用flutter_platform_widgets插件,根据不同的平台切换AppIcon。例如:
PlatformIconButton(
androidIcon: Icon(FontAwesomeIcons.circle),
androidPlainIcon: Icon(Icons.circle),
iosIcon: Icon(FontAwesomeIcons.circle),
onPressed: () {
if (Platform.isAndroid) {
print('可以更换Icon');
setLauncherActivity('MainActivity2'); // 更换启动Activity
} else {
print('不支持更换Icon');
}
},
)
在onPressed回调函数中调用setLauncherActivity函数,可以在运行时更换启动Activity,从而实现切换AppIcon的效果。