Flutter动画加载插件rive_loading的使用

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

Flutter动画加载插件 rive_loading 的使用

rive_loading 是一个基于 Rive 动画的加载小部件,允许您创建自定义加载小部件或对话框。本文将介绍如何在 Flutter 项目中使用 rive_loading 插件,并提供完整的示例代码。

安装

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

dependencies:
  rive_loading: ^0.1.6

然后运行 flutter pub get 来安装该插件。

使用方法

基本用法

以下是一个基本的 RiveLoading 小部件的使用示例:

RiveLoading(
  name: 'animation.riv',
  startAnimation: 'intro',
  loopAnimation: 'circle',
  endAnimation: 'end',
);

参数说明

  • name: Rive 动画的路径和名称。
  • until: 返回一个 Future 的回调函数,用于处理初始化过程。
  • isLoading: 如果您想通过布尔值管理加载状态,则可以使用此参数(作为 until 的替代)。
  • loopAnimation: 要循环播放的动画名称。
  • endAnimation: 当 until 完成或 isLoadingfalse 时要播放的结束动画名称。
  • startAnimation: 开始时要播放一次的动画名称。
  • height: 强制设置 Rive 动画的高度,默认情况下它会占用所有可用空间。
  • width: 强制设置 Rive 动画的宽度,默认情况下它会占用所有可用空间。
  • alignment: 设置 Rive 动画的对齐方式,默认居中。
  • onSuccess: 当动画完成且 isLoadingfalseuntil 完成时调用的回调函数。
  • onError: 当 until 失败时调用的回调函数。

可用模式

根据您的需求,您可以选择不同的动画模式:

单个动画

如果您只需要显示一个动画并停留在最后一帧,只需指定 startAnimation

RiveLoading(
  name: 'loading.riv',
  startAnimation: 'loading',
);

开始和循环动画

如果您的动画有一个开头和一个循环部分,只需指定 startAnimationloopAnimation

RiveLoading(
  name: 'loading.riv',
  startAnimation: 'intro',
  loopAnimation: 'loading',
);

结束和循环动画

如果您的动画有一个结束部分和一个循环部分,只需指定 endAnimationloopAnimation

RiveLoading(
  name: 'loading.riv',
  endAnimation: 'success',
  loopAnimation: 'loading',
);

开始和结束动画

如果您的动画有一个开头和一个结束部分,只需指定 startAnimationendAnimation

RiveLoading(
  name: 'loading.riv',
  startAnimation: 'intro',
  endAnimation: 'success',
);

开始、结束和循环动画

如果您的动画有一个开头、一个结束部分和一个循环部分,需指定 startAnimationendAnimationloopAnimation

RiveLoading(
  name: 'loading.riv',
  startAnimation: 'intro',
  loopAnimation: 'loading',
  endAnimation: 'success',
);

示例代码

下面是一个完整的示例代码,展示了如何在实际应用中使用 rive_loading 插件:

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

void main() => runApp(MyApp());

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

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  bool _isLoading = true;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.grey,
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Column(
        mainAxisSize: MainAxisSize.max,
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RiveLoading(
            name: 'loading.riv',
            loopAnimation: 'loading',
            endAnimation: 'success',
            width: 200,
            height: 200,
            fit: BoxFit.fill,
            until: () => Future.delayed(Duration(seconds: 5)),
            onSuccess: (_) {
              print('Finished');
            },
            onError: (err, stack) {
              print('error: $err');
            },
          ),
          Expanded(
            child: Row(
              children: <Widget>[
                Expanded(
                  child: RiveLoading(
                    name: 'loading.riv',
                    loopAnimation: 'loading',
                    endAnimation: 'success',
                    isLoading: _isLoading,
                    onSuccess: (_) {
                      print('Finished');
                    },
                    onError: (err, stack) {
                      print(err);
                    },
                  ),
                ),
                ElevatedButton(
                  child: Text('Toggle loading'),
                  onPressed: () => setState(
                    () {
                      _isLoading = !_isLoading;
                    },
                  ),
                ),
              ],
            ),
          ),
        ],
      ),
    );
  }
}

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

1 回复

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


当然,关于Flutter中的rive_loading插件的使用,以下是一个简单的代码示例,展示了如何在Flutter应用中使用Rive动画作为加载指示器。

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

dependencies:
  flutter:
    sdk: flutter
  rive: ^0.8.0  # 请检查最新版本号
  rive_loading: ^0.3.0  # 请检查最新版本号

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

接下来,确保你有一个Rive动画文件(.riv.flr格式)。你可以从Rive动画库下载,或者使用Rive动画编辑器自己创建。

下面是一个完整的Flutter应用示例,展示如何使用rive_loading插件:

import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
import 'package:rive_loading/rive_loading.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Rive Loading Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Rive Loading Example'),
        ),
        body: Center(
          child: RiveLoadingExample(),
        ),
      ),
    );
  }
}

class RiveLoadingExample extends StatefulWidget {
  @override
  _RiveLoadingExampleState createState() => _RiveLoadingExampleState();
}

class _RiveLoadingExampleState extends State<RiveLoadingExample> {
  @override
  Widget build(BuildContext context) {
    // 假设你的Rive动画文件名为'loading.riv',并且放在assets文件夹下
    final riveAsset = 'assets/loading.riv';

    return RiveLoading(
      riveAsset: riveAsset,
      size: 100, // 动画大小
      color: Colors.blue, // 动画颜色(如果动画本身没有颜色信息)
      fit: BoxFit.cover, // 动画适应方式
      controller: AnimationController(
        duration: const Duration(seconds: 1),
        vsync: VSynchronizer(), // 在桌面等非Flutter引擎平台需要提供VSync
      )..repeat(), // 使动画循环播放
    );
  }
}

在这个示例中:

  1. 我们定义了一个MyApp作为应用的根widget。
  2. MyApp中,我们使用了Scaffold来构建UI结构,并在body中放置了一个Center,其中包含了我们的RiveLoadingExample
  3. RiveLoadingExample是一个StatefulWidget,它的状态类中定义了Rive加载动画。
  4. _RiveLoadingExampleStatebuild方法中,我们创建了一个RiveLoadingwidget,并指定了Rive动画文件的路径(riveAsset),动画的大小(size),颜色(color),适应方式(fit),以及一个AnimationController来控制动画的播放。

注意:

  • 你需要将你的Rive动画文件放在assets文件夹下,并在pubspec.yaml中声明它,例如:
flutter:
  assets:
    - assets/loading.riv
  • AnimationControllervsync参数在Flutter移动平台上通常可以省略,但在桌面平台(如Windows、MacOS、Linux)上,你需要提供一个VSynchronizer实例来同步动画帧。

这样,你就可以在你的Flutter应用中使用Rive动画作为加载指示器了。

回到顶部