Flutter加载占位动画插件animated_shimmer的使用

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

Flutter加载占位动画插件animated_shimmer的使用

Animated Shimmer 是一个简单而轻量级的Flutter插件,用于显示带有闪烁效果的动画。它非常适合在从服务器或其他数据源加载数据时创建骨架屏。

示例

以下是一个示例GIF展示如何使用 Animated Shimmer 创建加载列表的效果:

Loading List

如何使用

添加依赖

首先,在你的 pubspec.yaml 文件中添加 animated_shimmer 依赖:

dependencies:
  animated_shimmer: ^1.0.0

然后运行 flutter pub get 来安装这个包。

导入库

在你的Dart代码中导入 animated_shimmer 库:

import 'package:animated_shimmer/animated_shimmer.dart';

使用 AnimatedShimmer 小部件

你可以通过指定高度和宽度来声明 AnimatedShimmer 小部件:

AnimatedShimmer(
  height: 10,
  width: 120,
),

你还可以传递多个参数来自定义动画的外观和感觉:

AnimatedShimmer(
  height: 10,
  width: 120,
  borderRadius: const BorderRadius.all(Radius.circular(16)),
  delayInMilliSeconds: Duration(milliseconds: index * 500),
),

要创建圆形的 AnimatedShimmer 小部件:

AnimatedShimmer.round(
  size: 50,
),

参数说明

  • height: 必填,设置闪烁效果的高度。
  • width: 必填,设置闪烁效果的宽度。
  • startColor: 设置闪烁效果开始的颜色。
  • endColor: 设置闪烁效果结束的颜色。
  • borderRadius: 设置动画小部件的边框半径。
  • delayInMilliSeconds: 设置动画开始的延迟时间,默认值为 Duration(milliseconds: 0)

完整示例 Demo

以下是一个完整的示例代码,展示了如何在列表中使用 AnimatedShimmer 小部件:

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

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

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

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: AnimatedShimmerWidget(),
    );
  }
}

class AnimatedShimmerWidget extends StatefulWidget {
  const AnimatedShimmerWidget({Key? key}) : super(key: key);

  @override
  State<AnimatedShimmerWidget> createState() => _AnimatedShimmerWidgetState();
}

class _AnimatedShimmerWidgetState extends State<AnimatedShimmerWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.separated(
        itemBuilder: (context, index) {
          return Container(
            decoration: BoxDecoration(
              color: Colors.white,
              borderRadius: BorderRadius.circular(8),
            ),
            margin: const EdgeInsets.symmetric(horizontal: 16),
            padding: const EdgeInsets.all(16),
            child: Row(
              children: [
                AnimatedShimmer.round(
                  size: 60,
                ),
                const SizedBox(
                  width: 8,
                ),
                Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    AnimatedShimmer(
                      height: 10,
                      width: 120,
                      borderRadius: const BorderRadius.all(Radius.circular(16)),
                      delayInMilliSeconds: Duration(milliseconds: index * 500),
                    ),
                    const SizedBox(
                      height: 8,
                    ),
                    AnimatedShimmer(
                      height: 10,
                      width: 180,
                      borderRadius: const BorderRadius.all(Radius.circular(16)),
                      delayInMilliSeconds: Duration(milliseconds: index * 500),
                    ),
                  ],
                )
              ],
            ),
          );
        },
        itemCount: 12,
        separatorBuilder: (context, index) => const SizedBox(
          height: 12,
        ),
      ),
    );
  }
}

以上代码创建了一个包含12个项目的列表,每个项目都包含一个圆形的 AnimatedShimmer 和两个矩形的 AnimatedShimmer 小部件。这可以模拟一个正在加载数据的用户界面。

许可证

此插件使用 MIT License。详细信息可以在 GitHub 上查看。


更多关于Flutter加载占位动画插件animated_shimmer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter加载占位动画插件animated_shimmer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用animated_shimmer插件来创建加载占位动画的一个简单示例。animated_shimmer插件常用于在数据加载时显示一个占位符动画,以提升用户体验。

首先,确保你已经在pubspec.yaml文件中添加了animated_shimmer依赖:

dependencies:
  flutter:
    sdk: flutter
  animated_shimmer: ^2.0.0  # 请检查最新版本号

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

接下来,你可以在你的Dart文件中使用AnimatedShimmer组件。下面是一个简单的例子,展示如何在一个列表项加载时使用占位动画:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Animated Shimmer Demo'),
        ),
        body: Center(
          child: Padding(
            padding: const EdgeInsets.all(16.0),
            child: FutureBuilder<List<String>>(
              future: fetchData(), // 假设这是一个模拟数据加载的函数
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return AnimatedShimmer.linear(
                    child: Column(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: List.generate(
                        5, // 假设我们加载5个列表项
                        (index) => Padding(
                          padding: const EdgeInsets.only(bottom: 8.0),
                          child: Row(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Container(
                                width: 32,
                                height: 32,
                                decoration: BoxDecoration(
                                  color: Colors.grey[300]!,
                                  borderRadius: BorderRadius.circular(8),
                                ),
                              ),
                              SizedBox(width: 16),
                              ShimmerBase(
                                width: 200,
                                height: 20,
                                child: Container(
                                  decoration: BoxDecoration(
                                    color: Colors.grey[300]!,
                                    borderRadius: BorderRadius.circular(4),
                                  ),
                                ),
                              ),
                            ],
                          ),
                        ),
                      ),
                    ),
                  );
                } else if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                } else if (snapshot.hasData) {
                  return ListView.builder(
                    itemCount: snapshot.data!.length,
                    itemBuilder: (context, index) {
                      return Padding(
                        padding: const EdgeInsets.only(bottom: 8.0),
                        child: Row(
                          crossAxisAlignment: CrossAxisAlignment.start,
                          children: [
                            CircleAvatar(
                              backgroundColor: Colors.grey[300]!,
                              child: Text(snapshot.data![index][0]),
                            ),
                            SizedBox(width: 16),
                            Text(snapshot.data![index]),
                          ],
                        ),
                      );
                    },
                  );
                } else {
                  return CircularProgressIndicator(); // 如果不是等待状态,也不是错误或有数据状态,显示加载指示器
                }
              },
            ),
          ),
        ),
      ),
    );
  }

  // 模拟数据加载函数
  Future<List<String>> fetchData() async {
    await Future.delayed(Duration(seconds: 2)); // 模拟网络延迟
    return List.generate(
      5,
      (index) => 'Item ${index + 1}',
    );
  }
}

在这个例子中,我们使用了FutureBuilder来模拟异步数据加载。当数据正在加载时,AnimatedShimmer.linear被用来显示一个线性占位动画。一旦数据加载完成,我们显示真实的数据列表。

AnimatedShimmer.linear接受一个child,在这个例子中,child是一个包含多个占位符动画的Column。每个占位符动画都由ContainerShimmerBase组成,模拟真实数据的外观。

你可以根据需要调整占位符的样式和布局,以匹配你的实际UI设计。

回到顶部