You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Rive状态机动画正常,但onRiveEvent事件无法触发

Flutter中Rive动画onRiveEvent事件未触发问题解决

我在Flutter里测试Rive动画,想基于Rive触发器使用可变数据。用的是一个简单的点击动画,动画能正常运行,但onRiveEvent事件始终没触发,没法修改数据,预期是调试控制台能打印内容。

原代码

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

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  // SMIInput<bool>? _booleanInput;
  void onRiveEvent(RiveEvent event) {
    print('sdasda');
    print(event);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RiveAnimation.asset('assets/test2.riv',
            onInit: (Artboard artboard) {
          final controller =
              StateMachineController.fromArtboard(artboard, 'State Machine 1');
          controller!.addEventListener(onRiveEvent);
          artboard.addController(controller);
          // _booleanInput = controller.findInput<bool>('on');
        }),
      ),
    );
  }
}

解决方法

1. 检查Rive文件的事件配置

  • 打开你的test2.riv文件,确认状态机State Machine 1中已添加Trigger类型事件,并且该事件已绑定到点击触发的状态过渡动作上。
  • 确保事件名称拼写完全正确,Rive的事件名称区分大小写。

2. 修复代码中的控制器空安全问题

原代码直接强制解包controller,如果状态机名称匹配失败会导致崩溃,同时可能影响事件监听逻辑。修改为带空判断的写法:

final controller = StateMachineController.fromArtboard(artboard, 'State Machine 1');
if (controller != null) {
  controller.addEventListener(onRiveEvent);
  artboard.addController(controller);
} else {
  debugPrint('未找到指定状态机:State Machine 1');
}

3. 更新Rive包版本

旧版本的rive包可能存在事件监听的bug,执行flutter pub upgrade rive升级到最新稳定版。

4. 验证事件触发动作

在Rive编辑器中,确认点击动画的状态过渡里,除了播放动画,还添加了Send Event的动作,确保事件能被正确发送到Flutter端。

修改后的完整代码

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

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  void onRiveEvent(RiveEvent event) {
    print('事件触发:');
    print('事件名称:${event.name}');
    print('事件数据:${event.data}');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: RiveAnimation.asset(
          'assets/test2.riv',
          onInit: (Artboard artboard) {
            final controller = StateMachineController.fromArtboard(artboard, 'State Machine 1');
            if (controller != null) {
              controller.addEventListener(onRiveEvent);
              artboard.addController(controller);
            } else {
              debugPrint('无法找到状态机 "State Machine 1"');
            }
          },
        ),
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者Richard Winter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:23:10