Fix event listening for RuntimeArtboard

Flutter runtime needed an additional callback hooked up to listen for nested artboard events because its main artboard is a RuntimeArtboard.

Diffs=
c5f85ed7f Fix event listening for RuntimeArtboard (#6202)
5e33d8c96 fix: Made default and copy constructors explicit. (#6203)

Co-authored-by: Gordon Hayes <pggordonhayes@gmail.com>
Co-authored-by: Philip Chung <philterdesign@gmail.com>
This commit is contained in:
HayesGordon
2023-11-06 10:27:38 +00:00
parent 73731ffa6e
commit bee29187dd
3 changed files with 26 additions and 2 deletions

View File

@ -1 +1 @@
ef8a4e7f711aef6b2d468a885a79f919118bae70
c5f85ed7fd25d0d12287cf6ff9a84dac7443129c

View File

@ -153,7 +153,12 @@ class StateMachineController extends core.StateMachineController {
}) {
for (final animation in artboard.animations) {
if (animation is StateMachine && animation.name == stateMachineName) {
return StateMachineController(animation, onStateChange: onStateChange);
final controller =
StateMachineController(animation, onStateChange: onStateChange);
if (artboard is RuntimeArtboard) {
artboard.addNestedEventListener(controller);
}
return controller;
}
}
return null;

View File

@ -1,3 +1,4 @@
import 'package:flutter/scheduler.dart';
import 'package:rive/rive.dart';
import 'package:rive/src/core/core.dart';
import 'package:rive/src/rive_core/component.dart';
@ -149,4 +150,22 @@ class RuntimeArtboard extends Artboard implements CoreContext {
artboard.clean();
return artboard;
}
void addNestedEventListener(StateMachineController controller) {
activeNestedArtboards.forEach((artboard) {
if (artboard.mountedArtboard is RuntimeMountedArtboard) {
(artboard.mountedArtboard as RuntimeMountedArtboard).eventCallback =
(event, target) => _handleNestedEvent(event, target, controller);
}
});
}
void _handleNestedEvent(
Event event, NestedArtboard target, StateMachineController controller) {
if (controller.hasListenerWithTarget(target)) {
controller.reportNestedEvent(event, target);
SchedulerBinding.instance
.addPostFrameCallback((_) => controller.isActive = true);
}
}
}