Flutter Rive点击触发动画报错:期望SMITrigger却获SMIBool
解决Flutter中Rive点击触发动画的类型错误问题
问题原因
你遇到的Expected a value of type 'SMITrigger', but got one of type 'SMIBool'错误,是因为代码里强行把状态机的第一个输入(类型为SMIBool)转换成了SMITrigger。你原本已经用findSMI('look up')尝试查找正确的触发器,但后面又覆盖了这个结果,导致类型不匹配。
解决方案
- 移除
trigger = stateMachineController!.inputs.first as SMITrigger;这行错误代码,保留通过findSMI精准查找触发器的逻辑。 - 增加类型判断,确保找到的输入确实是
SMITrigger类型,避免后续调用fire()时出错。
修改后的完整代码
class GlassCard extends StatefulWidget { const GlassCard({super.key}); @override State<GlassCard> createState() => _GlassCardState(); } class _GlassCardState extends State<GlassCard> { Artboard? _birdArtboard; SMITrigger? _lookUpTrigger; StateMachineController? _stateMachineController; @override void initState() { super.initState(); rootBundle.load('assets/bird.riv').then( (data) { final file = RiveFile.import(data); final artboard = file.mainArtboard; // 获取状态机控制器 _stateMachineController = StateMachineController.fromArtboard(artboard, "birb"); if (_stateMachineController != null) { artboard.addController(_stateMachineController!); // 精准查找名为"look up"的触发器,并判断类型 final input = _stateMachineController!.findSMI('look up'); if (input is SMITrigger) { _lookUpTrigger = input; } } setState(() => _birdArtboard = artboard); }, ); } void _triggerLookUp() { _lookUpTrigger?.fire(); } @override Widget build(BuildContext context) { return Center( child: SizedBox( height: 400, width: 400, child: _birdArtboard == null ? const SizedBox() : GestureDetector( onTap: _triggerLookUp, child: Rive(artboard: _birdArtboard!), ), ), ); } }
关键说明
- 通过
findSMI('look up')精准获取对应名称的状态机输入,避免了取第一个输入的盲目性。 - 增加
input is SMITrigger的类型判断,确保只有当找到的输入是触发器类型时才赋值,防止类型转换错误。 - 变量名做了更清晰的命名(比如
_lookUpTrigger、_stateMachineController),提升代码可读性。
内容的提问来源于stack exchange,提问作者Regnas01
相关产品推荐
相关产品推荐

