Flutter动态图标插件live_icon的使用

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

Flutter动态图标插件live_icon的使用

插件简介

live_icon 是一个用于在运行时动态更改应用图标的Flutter插件。通过这个插件,你可以在应用程序运行时切换不同的图标和标签,而无需重新安装应用。

Live_Icon

功能特性

  • ✅ 更改应用图标
  • ✅ 更改应用标签

快速开始

步骤 1: 将插件添加到项目中

pubspec.yaml 文件中添加 live_icon 依赖:

dependencies:
  live_icon: ^<latest version>
步骤 2: 在 AndroidManifest.xml 中添加 activity-alias

为了支持动态图标切换,你需要在 AndroidManifest.xml 中为每个图标变体添加 activity-alias。例如:

<application
    android:label="live_icon_example"
    android:icon="@mipmap/ic_launcher">
    
    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        <meta-data
            android:name="io.flutter.embedding.android.NormalTheme"
            android:resource="@style/NormalTheme" />
        <meta-data
            android:name="io.flutter.embedding.android.SplashScreenDrawable"
            android:resource="@drawable/launch_background" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <!-- Live Icon Addition -->
    <activity-alias
        android:name=".DarkTheme"
        android:enabled="false"
        android:icon="@mipmap/dark_theme"
        android:label="DarkThemeLabel"
        android:targetActivity=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity-alias>

    <activity-alias
        android:name=".LightTheme"
        android:enabled="false"
        android:icon="@mipmap/light_theme"
        android:label="LightThemeLabel"
        android:targetActivity=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity-alias>
    <!-- Live Icon Addition -->

    <meta-data
        android:name="flutterEmbedding"
        android:value="2" />

</application>
步骤 3: 创建对应的 Java/Kotlin 类

为每个 activity-alias 创建相应的 Java 或 Kotlin 类。例如:

  1. DarkTheme.java
package com.hackthedeveloper.live_icon_example;

public class DarkTheme {
}
  1. LightTheme.java
package com.hackthedeveloper.live_icon_example;

public class LightTheme {
}
步骤 4: 初始化插件

在 Dart 代码中初始化 live_icon 插件,并传入所有 activity-alias 的类名。注意,MainActivity 也需要包含在内,因为它包含了启动意图。

import 'package:live_icon/live_icon.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  LiveIcon liveIcon = LiveIcon();

  [@override](/user/override)
  void initState() {
    LiveIcon.initialize(
      classNames: ['MainActivity', 'DarkTheme', 'LightTheme'],
    );
    super.initState();
  }

  void switchAppIcon(String className) async {
    await liveIcon.switchIconTo(
      className: className,
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                child: Text('切换到深色主题图标'),
                onPressed: () {
                  switchAppIcon('DarkTheme');
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                child: Text('切换到浅色主题图标'),
                onPressed: () {
                  switchAppIcon('LightTheme');
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

完整示例 Demo

以下是一个完整的示例代码,展示了如何使用 live_icon 插件在运行时切换应用图标:

import 'package:flutter/material.dart';
import 'package:live_icon/live_icon.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  LiveIcon liveIcon = LiveIcon();

  [@override](/user/override)
  void initState() {
    // 初始化插件并传入所有 activity-alias 的类名
    LiveIcon.initialize(
      classNames: ['MainActivity', 'DarkTheme', 'LightTheme'],
    );
    super.initState();
  }

  // 切换应用图标的方法
  void switchAppIcon(String className) async {
    try {
      await liveIcon.switchIconTo(
        className: className,
      );
      // 成功切换后显示提示信息
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('已切换到 $className 图标')),
      );
    } catch (e) {
      // 如果切换失败,显示错误信息
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('切换图标失败: $e')),
      );
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('动态图标示例'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              ElevatedButton(
                child: Text('切换到深色主题图标'),
                onPressed: () {
                  switchAppIcon('DarkTheme');
                },
              ),
              SizedBox(height: 20),
              ElevatedButton(
                child: Text('切换到浅色主题图标'),
                onPressed: () {
                  switchAppIcon('LightTheme');
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter动态图标插件live_icon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter动态图标插件live_icon的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用live_icon插件来实现动态图标的示例代码。live_icon插件允许你创建可以动态更新的图标,这在显示加载指示器、通知图标等场景中非常有用。

首先,你需要在pubspec.yaml文件中添加live_icon依赖:

dependencies:
  flutter:
    sdk: flutter
  live_icon: ^最新版本号 # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们来看一个完整的示例,展示如何使用live_icon插件来创建一个简单的动态图标。

示例代码

import 'package:flutter/material.dart';
import 'package:live_icon/live_icon.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Live Icon Example'),
        ),
        body: Center(
          child: LiveIconExample(),
        ),
      ),
    );
  }
}

class LiveIconExample extends StatefulWidget {
  @override
  _LiveIconExampleState createState() => _LiveIconExampleState();
}

class _LiveIconExampleState extends State<LiveIconExample> with SingleTickerProviderStateMixin {
  bool _isLoading = false;
  AnimationController _controller;

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      duration: const Duration(seconds: 1),
      vsync: this,
    )..repeat(reverse: true);
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _toggleLoading() {
    setState(() {
      _isLoading = !_isLoading;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        AnimatedLiveIcon(
          icon: _isLoading
              ? AnimatedIcons.menu_arrow // 使用Flutter内置的动画图标
              : Icons.home,
          color: Colors.blue,
          size: 50,
          animation: _isLoading ? _controller : null,
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _toggleLoading,
          child: Text(_isLoading ? 'Stop Loading' : 'Start Loading'),
        ),
      ],
    );
  }
}

解释

  1. 依赖导入:首先,我们在pubspec.yaml文件中添加了live_icon依赖。
  2. 主应用MyApp是我们的主应用,它包含一个Scaffold,其中包含一个Center居中的LiveIconExample组件。
  3. LiveIconExample:这是一个有状态的组件,用于管理图标的加载状态和动画控制器。
  4. initState 和 dispose:在initState中,我们初始化了一个AnimationController,并在dispose中释放它。
  5. toggleLoading:一个方法用于切换加载状态。
  6. build:在build方法中,我们使用AnimatedLiveIcon组件来显示图标。如果_isLoadingtrue,则显示一个动画图标(AnimatedIcons.menu_arrow),否则显示一个静态图标(Icons.home)。如果处于加载状态,则传递动画控制器给animation参数。

这个示例展示了如何使用live_icon插件来根据状态动态显示不同的图标,并且可以在加载状态下显示动画图标。你可以根据需要进一步自定义和扩展这个示例。

回到顶部