Flutter动画加载插件dotlottie_loader的使用

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

Flutter动画加载插件dotlottie_loader的使用

dotLottieLoader for Flutter

pub package

dotLottieLoader 是一个帮助下载和解压缩 .lottie 文件的库,可以访问动画以及包含在包中的资源。这个仓库是基于 dotottieloader-android 库的纯 Dart 版本。

它适用于 Android、iOS、macOS、Linux、Windows 和 Web。

安装

flutter pub add dotlottie_loader

还需要安装 lottie 包来渲染动画。

使用

从应用资源加载

DotLottieLoader.fromAsset("assets/anim2.lottie",
    frameBuilder: (BuildContext ctx, DotLottie? dotlottie) {
  if (dotlottie != null) {
    return Lottie.memory(dotlottie.animations.values.single);
  } else {
    return Container();
  }
}),

从网络加载

DotLottieLoader.fromNetwork(
  "https://github.com/sartajroshan/dotlottieloader-flutter/raw/master/example/assets/animation.lottie",
  frameBuilder: (ctx, dotlottie) {
    if (dotlottie != null) {
      return Lottie.memory(dotlottie!.animations.values.single);
    } else {
      return Container();
    }
  },
  errorBuilder: (ctx, e, s) {
    print(s);
    return Text(e.toString());
  },
),

带有图片的加载

DotLottieLoader.fromAsset(
  "assets/animation_external_image.lottie",
  frameBuilder: (ctx, dotlottie) {
    if (dotlottie != null) {
      return Lottie.memory(dotlottie.animations.values.single,
          imageProviderFactory: (asset) {
        return MemoryImage(dotlottie.images[asset.fileName]!);
      });
    } else {
      return Container();
    }
  },
),

DotLottie 数据结构

class ManifestAnimation {
  String id;
  double speed;
  String? themeColor;
  bool loop;

  ManifestAnimation(this.id, this.speed, this.themeColor, this.loop);
}

class Manifest {
  String? generator, author;
  int? revision;
  String? version;
  late List<ManifestAnimation> animations;
  Map<String, dynamic>? custom;

  Manifest(this.generator, this.author, this.revision, this.version,
      this.animations, this.custom);
}

class DotLottie {
  Manifest? manifest;
  Map<String, Uint8List> animations;
  Map<String, Uint8List> images;

  DotLottie(this.manifest, this.animations, this.images);
}

查看更多文档

更多信息请参考 dotlottie.io

示例代码

以下是一个完整的示例代码,展示了如何使用 dotlottie_loader 加载不同类型的 Lottie 动画:

import 'package:dotlottie_loader/dotlottie_loader.dart';
import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'DotLottieLoader Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("DotLottie Loader"),
      ),
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            children: [
              /// 简单的 .Lottie 动画
              DotLottieLoader.fromAsset("assets/animation.lottie",
                  frameBuilder: (ctx, dotlottie) {
                if (dotlottie != null) {
                  return Lottie.memory(dotlottie.animations.values.single);
                } else {
                  return Container();
                }
              }),
              const SizedBox(height: 20),

              /// 从网络加载 .Lottie 动画
              DotLottieLoader.fromNetwork(
                "https://github.com/sartajroshan/dotlottieloader-flutter/raw/master/example/assets/animation.lottie",
                frameBuilder: (ctx, dotlottie) {
                  if (dotlottie != null) {
                    return Lottie.memory(
                      dotlottie.animations.values.single,
                    );
                  } else {
                    return Container();
                  }
                },
                errorBuilder: (ctx, e, s) {
                  return Text(e.toString());
                },
              ),
              const SizedBox(height: 20),

              /// 带外部图片的 .lottie 动画
              DotLottieLoader.fromAsset(
                  "assets/animation_external_image.lottie",
                  frameBuilder: (ctx, dotlottie) {
                if (dotlottie != null) {
                  return Lottie.memory(dotlottie.animations.values.single,
                      imageProviderFactory: (asset) {
                    return MemoryImage(dotlottie.images[asset.fileName]!);
                  });
                } else {
                  return Container();
                }
              }),
              const SizedBox(height: 20),

              /// 带内联图片的 .lottie 动画
              DotLottieLoader.fromAsset("assets/animation_inline_image.lottie",
                  frameBuilder: (ctx, dotlottie) {
                if (dotlottie != null) {
                  return Lottie.memory(dotlottie.animations.values.single,
                      imageProviderFactory: (asset) {
                    return MemoryImage(dotlottie.images[asset.fileName]!);
                  });
                } else {
                  return Container();
                }
              }),
            ],
          ),
        ),
      ),
    );
  }
}

以上代码展示了如何在 Flutter 应用中使用 dotlottie_loader 插件加载和显示不同来源的 Lottie 动画。希望这些信息对你有所帮助!


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用dotlottie_loader插件来实现动画加载效果的示例代码。这个插件允许你使用Lottie动画作为加载指示器。

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

dependencies:
  flutter:
    sdk: flutter
  dotlottie_loader: ^latest_version  # 请替换为最新版本号

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

接下来,创建一个Lottie JSON文件,并将其放置在项目的assets文件夹中。例如,假设你有一个名为loading.json的Lottie动画文件。

pubspec.yaml文件中,确保你的assets部分包含了这个文件:

flutter:
  assets:
    - assets/loading.json

现在,你可以在你的Flutter应用中使用DotLottieLoader组件来显示加载动画。以下是一个完整的示例代码:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  bool isLoading = true; // 模拟加载状态

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DotLottieLoader 示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            if (isLoading)
              DotLottieLoader(
                assetName: 'assets/loading.json',
                size: 100, // 动画大小
                color: Colors.blue, // 动画颜色
                duration: 2000, // 动画时长(毫秒)
                repeatCount: DotLottieLoaderRepeatCount.indefinite, // 无限循环
              ),
            Text(
              isLoading ? '加载中...' : '加载完成',
              style: TextStyle(fontSize: 20),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // 模拟加载完成
          setState(() {
            isLoading = !isLoading;
          });
        },
        tooltip: '切换加载状态',
        child: Icon(isLoading ? Icons.pause : Icons.play_arrow),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它包含一个DotLottieLoader组件来显示Lottie加载动画。我们还添加了一个FloatingActionButton来切换加载状态,以便你可以看到动画在加载和完成之间的切换。

确保你的loading.json文件是有效的Lottie动画文件,这样你就可以看到动画效果了。

希望这个示例能帮助你更好地理解和使用dotlottie_loader插件!

回到顶部