Flutter动画图标主题插件animated_icon_theme的使用

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

Flutter动画图标主题插件animated_icon_theme的使用

使用

animated_icon_theme 是一个隐式地提供平滑动画图标的主题数据的小部件。

AnimatedIconTheme(
  curve: Curves.linear,
  duration: const Duration(milliseconds: 200),
  data: IconThemeData(
    color: _color,
    opacity: _opacity,
    size: _size,
  ),
  child: const Wrap(
    spacing: 5,
    children: [
      Icon(Icons.bookmark),
      Icon(Icons.favorite),
      Icon(Icons.star),
    ],
  ),
)

要了解有关 animated_icon_theme 中使用的类和其他引用的更多信息,请参阅 API Reference

示例代码

以下是一个完整的示例代码,展示了如何在应用中使用 animated_icon_theme 插件。

import 'package:flutter/material.dart';
import 'package:animated_icon_theme/animated_icon_theme.dart';
import 'package:animated_checkmark/animated_checkmark.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // 这是你的应用的根小部件。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Animated Icon Theme',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        useMaterial3: false,
      ),
      home: const MyHomePage(title: 'Animated Icon Theme'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  double _size = 64;
  double _opacity = 1.0;
  Color? _color;

  // 设置颜色
  void setColor(Color color) {
    setState(() => _color = color);
  }

  // 设置大小
  void setSize(double size) {
    setState(() => _size = size);
  }

  // 设置不透明度
  void setOpacity(double opacity) {
    setState(() => _opacity = opacity);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 动画图标主题
            AnimatedIconTheme(
              data: IconThemeData(
                color: _color,
                opacity: _opacity,
                size: _size,
              ),
              child: const Wrap(
                spacing: 5,
                children: [
                  Icon(Icons.bookmark),
                  Icon(Icons.favorite),
                  Icon(Icons.star),
                ],
              ),
            ),
            const SizedBox(height: 10),
            // 大小调节滑块
            SizedBox(
              width: 250,
              child: Slider(
                value: _size,
                max: 200,
                min: 10,
                label: _size.round().toString(),
                onChanged: setSize,
              ),
            ),
            const SizedBox(height: 10),
            // 不透明度调节滑块
            SizedBox(
              width: 250,
              child: Slider(
                value: _opacity,
                max: 1,
                min: 0,
                label: _opacity.round().toString(),
                onChanged: setOpacity,
              ),
            ),
            const SizedBox(height: 10),
            // 颜色选择器
            Container(
              width: 200,
              alignment: Alignment.center,
              child: GridView.builder(
                shrinkWrap: true,
                itemCount: Colors.primaries.length,
                gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
                  mainAxisSpacing: 2,
                  crossAxisSpacing: 2,
                  crossAxisCount: 6,
                ),
                itemBuilder: (_, i) {
                  final color = Colors.primaries[i];
                  return Card(
                    color: color,
                    child: InkWell(
                      onTap: () => setColor(color),
                      child: AnimatedCheckmark(
                        weight: 4,
                        color: Colors.white70,
                        value: _color == color,
                      ),
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用animated_icon_theme插件的示例代码。animated_icon_theme是一个允许你为Flutter中的AnimatedIcon自定义主题属性的插件。虽然Flutter本身提供了AnimatedIconAnimatedIconData,但animated_icon_theme可以让你更方便地管理这些图标的主题。

首先,你需要确保你的pubspec.yaml文件中包含了animated_icon_theme依赖:

dependencies:
  flutter:
    sdk: flutter
  animated_icon_theme: ^x.y.z  # 替换为最新版本号

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

下面是一个完整的示例代码,展示了如何使用AnimatedIconTheme来设置全局的动画图标主题:

import 'package:flutter/material.dart';
import 'package:animated_icon_theme/animated_icon_theme.dart'; // 导入插件

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter AnimatedIconTheme Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      // 使用AnimatedIconTheme包装MaterialApp
      builder: (context, child) {
        return AnimatedIconTheme(
          data: AnimatedIconThemeData(
            color: Colors.red, // 设置默认颜色
            size: 24.0,        // 设置默认大小
          ),
          child: child,
        );
      },
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin {
  late AnimationController _controller;

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

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AnimatedIconTheme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用默认的AnimatedIconTheme主题
            AnimatedIcon(
              icon: AnimatedIcons.menu_arrow,
              progress: _controller.value,
            ),
            SizedBox(height: 20),
            // 局部覆盖AnimatedIconTheme主题
            AnimatedIconTheme.withData(
              data: AnimatedIconThemeData(
                color: Colors.blue,
                size: 36.0,
              ),
              child: AnimatedIcon(
                icon: AnimatedIcons.plus_minus,
                progress: _controller.value,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中:

  1. AnimatedIconTheme被用来包装MaterialApp,并设置了全局的动画图标主题,包括颜色和大小。
  2. MyHomePage中,第一个AnimatedIcon使用了全局的动画图标主题。
  3. 第二个AnimatedIcon使用了AnimatedIconTheme.withData来局部覆盖全局主题,展示了如何针对特定图标应用不同的主题。

这个示例展示了如何使用animated_icon_theme插件来全局和局部地管理Flutter应用中的动画图标主题。请注意,由于animated_icon_theme插件可能不是Flutter官方提供的插件(Flutter本身提供了AnimatedIcon),你需要根据具体插件的文档和API来调整代码。上面的示例假设animated_icon_theme插件的API与Flutter的IconTheme类似。

回到顶部