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
相关产品推荐
相关产品推荐

