Flutter动态应用图标插件variable_app_icon的使用

发布于 1周前 作者 bupafengyu 来自 Flutter

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标签中的labelicon属性。

从主活动的<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

Android Demo

iOS

iOS Demo

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

1 回复

更多关于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 来获取依赖。

接下来,你需要按照以下步骤配置你的项目:

  1. 配置 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_backgroundic_foreground 是你放置在 res/drawable 目录下的矢量图资源。

  2. 在 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 上的支持可能有限,通常需要手动配置更多内容。
  3. iOS 额外配置(简要说明):

    • 将你的图标资源添加到 Xcode 项目中。
    • Info.plist 中,为每个可能的图标尺寸添加 CFBundleIcons 配置。
    • 由于 iOS 的限制,动态更改应用图标通常需要重启应用或用户手动操作,插件可能无法完全自动化这一过程。

请注意,动态更改应用图标功能在某些平台上可能受到限制,特别是在 iOS 上。务必在目标平台上进行充分测试,以确保该功能按预期工作。

回到顶部