@@ -75,12 +75,12 @@ Set<Type> _factoriesTypeSet<T>(Set<Factory<T>> factories) {
75
75
///
76
76
/// * [AndroidView] which is a widget that is used to show an Android view.
77
77
/// * [PlatformViewsService] which is a service for controlling platform views.
78
- class RenderAndroidView extends RenderBox {
78
+ class RenderAndroidView extends RenderBox with _PlatformViewGestureMixin {
79
79
80
80
/// Creates a render object for an Android view.
81
81
RenderAndroidView ({
82
82
@required AndroidViewController viewController,
83
- @required this . hitTestBehavior,
83
+ @required PlatformViewHitTestBehavior hitTestBehavior,
84
84
@required Set <Factory <OneSequenceGestureRecognizer >> gestureRecognizers,
85
85
}) : assert (viewController != null ),
86
86
assert (hitTestBehavior != null ),
@@ -89,6 +89,7 @@ class RenderAndroidView extends RenderBox {
89
89
_motionEventsDispatcher = _MotionEventsDispatcher (globalToLocal, viewController);
90
90
updateGestureRecognizers (gestureRecognizers);
91
91
_viewController.addOnPlatformViewCreatedListener (_onPlatformViewCreated);
92
+ this .hitTestBehavior = hitTestBehavior;
92
93
}
93
94
94
95
_PlatformViewState _state = _PlatformViewState .uninitialized;
@@ -117,11 +118,6 @@ class RenderAndroidView extends RenderBox {
117
118
markNeedsSemanticsUpdate ();
118
119
}
119
120
120
- /// How to behave during hit testing.
121
- // The implicit setter is enough here as changing this value will just affect
122
- // any newly arriving events there's nothing we need to invalidate.
123
- PlatformViewHitTestBehavior hitTestBehavior;
124
-
125
121
/// {@template flutter.rendering.platformView.updateGestureRecognizers}
126
122
/// Updates which gestures should be forwarded to the platform view.
127
123
///
@@ -139,16 +135,7 @@ class RenderAndroidView extends RenderBox {
139
135
/// Any active gesture arena the Android view participates in is rejected when the
140
136
/// set of gesture recognizers is changed.
141
137
void updateGestureRecognizers (Set <Factory <OneSequenceGestureRecognizer >> gestureRecognizers) {
142
- assert (gestureRecognizers != null );
143
- assert (
144
- _factoriesTypeSet (gestureRecognizers).length == gestureRecognizers.length,
145
- 'There were multiple gesture recognizer factories for the same type, there must only be a single '
146
- 'gesture recognizer factory for each gesture recognizer type.' ,);
147
- if (_factoryTypesSetEquals (gestureRecognizers, _gestureRecognizer? .gestureRecognizerFactories)) {
148
- return ;
149
- }
150
- _gestureRecognizer? .dispose ();
151
- _gestureRecognizer = _AndroidViewGestureRecognizer (_motionEventsDispatcher, gestureRecognizers);
138
+ _updateGestureRecognizersWithCallBack (gestureRecognizers, _motionEventsDispatcher.handlePointerEvent);
152
139
}
153
140
154
141
@override
@@ -162,8 +149,6 @@ class RenderAndroidView extends RenderBox {
162
149
163
150
_MotionEventsDispatcher _motionEventsDispatcher;
164
151
165
- _AndroidViewGestureRecognizer _gestureRecognizer;
166
-
167
152
@override
168
153
void performResize () {
169
154
size = constraints.biggest;
@@ -229,24 +214,6 @@ class RenderAndroidView extends RenderBox {
229
214
));
230
215
}
231
216
232
- @override
233
- bool hitTest (BoxHitTestResult result, { Offset position }) {
234
- if (hitTestBehavior == PlatformViewHitTestBehavior .transparent || ! size.contains (position))
235
- return false ;
236
- result.add (BoxHitTestEntry (this , position));
237
- return hitTestBehavior == PlatformViewHitTestBehavior .opaque;
238
- }
239
-
240
- @override
241
- bool hitTestSelf (Offset position) => hitTestBehavior != PlatformViewHitTestBehavior .transparent;
242
-
243
- @override
244
- void handleEvent (PointerEvent event, HitTestEntry entry) {
245
- if (event is PointerDownEvent ) {
246
- _gestureRecognizer.addPointer (event);
247
- }
248
- }
249
-
250
217
@override
251
218
void describeSemanticsConfiguration (SemanticsConfiguration config) {
252
219
super .describeSemanticsConfiguration (config);
@@ -257,12 +224,6 @@ class RenderAndroidView extends RenderBox {
257
224
config.platformViewId = _viewController.id;
258
225
}
259
226
}
260
-
261
- @override
262
- void detach () {
263
- _gestureRecognizer.reset ();
264
- super .detach ();
265
- }
266
227
}
267
228
268
229
/// A render object for an iOS UIKit UIView.
@@ -486,15 +447,17 @@ class _UiKitViewGestureRecognizer extends OneSequenceGestureRecognizer {
486
447
}
487
448
}
488
449
450
+ typedef _HandlePointerEvent = void Function (PointerEvent event);
451
+
489
452
// This recognizer constructs gesture recognizers from a set of gesture recognizer factories
490
- // it was give, adds all of them to a gesture arena team with the _AndroidViewGestureRecognizer
453
+ // it was give, adds all of them to a gesture arena team with the _PlatformViewGestureRecognizer
491
454
// as the team captain.
492
- // As long as ta gesture arena is unresolved the recognizer caches all pointer events.
493
- // When the team wins the recognizer sends all the cached point events to the embedded Android view , and
494
- // sets itself to a "forwarding mode" where it will forward any new pointer event to the Android view .
495
- class _AndroidViewGestureRecognizer extends OneSequenceGestureRecognizer {
496
- _AndroidViewGestureRecognizer (
497
- this .dispatcher ,
455
+ // As long as the gesture arena is unresolved, the recognizer caches all pointer events.
456
+ // When the team wins, the recognizer sends all the cached pointer events to `_handlePointerEvent` , and
457
+ // sets itself to a "forwarding mode" where it will forward any new pointer event to `_handlePointerEvent` .
458
+ class _PlatformViewGestureRecognizer extends OneSequenceGestureRecognizer {
459
+ _PlatformViewGestureRecognizer (
460
+ _HandlePointerEvent handlePointerEvent ,
498
461
this .gestureRecognizerFactories, {
499
462
PointerDeviceKind kind,
500
463
}) : super (kind: kind) {
@@ -505,18 +468,19 @@ class _AndroidViewGestureRecognizer extends OneSequenceGestureRecognizer {
505
468
return recognizerFactory.constructor ()..team = team;
506
469
},
507
470
).toSet ();
471
+ _handlePointerEvent = handlePointerEvent;
508
472
}
509
473
510
- final _MotionEventsDispatcher dispatcher ;
474
+ _HandlePointerEvent _handlePointerEvent ;
511
475
512
476
// Maps a pointer to a list of its cached pointer events.
513
477
// Before the arena for a pointer is resolved all events are cached here, if we win the arena
514
- // the cached events are dispatched to the view , if we lose the arena we clear the cache for
478
+ // the cached events are dispatched to `_handlePointerEvent` , if we lose the arena we clear the cache for
515
479
// the pointer.
516
480
final Map <int , List <PointerEvent >> cachedEvents = < int , List <PointerEvent >> {};
517
481
518
482
// Pointer for which we have already won the arena, events for pointers in this set are
519
- // immediately dispatched to the Android view .
483
+ // immediately dispatched to `_handlePointerEvent` .
520
484
final Set <int > forwardedPointers = < int > {};
521
485
522
486
// We use OneSequenceGestureRecognizers as they support gesture arena teams.
@@ -534,24 +498,24 @@ class _AndroidViewGestureRecognizer extends OneSequenceGestureRecognizer {
534
498
}
535
499
536
500
@override
537
- String get debugDescription => 'Android view' ;
501
+ String get debugDescription => 'Platform view' ;
538
502
539
503
@override
540
504
void didStopTrackingLastPointer (int pointer) { }
541
505
542
506
@override
543
507
void handleEvent (PointerEvent event) {
544
508
if (! forwardedPointers.contains (event.pointer)) {
545
- cacheEvent (event);
509
+ _cacheEvent (event);
546
510
} else {
547
- dispatcher. handlePointerEvent (event);
511
+ _handlePointerEvent (event);
548
512
}
549
513
stopTrackingIfPointerNoLongerDown (event);
550
514
}
551
515
552
516
@override
553
517
void acceptGesture (int pointer) {
554
- flushPointerCache (pointer);
518
+ _flushPointerCache (pointer);
555
519
forwardedPointers.add (pointer);
556
520
}
557
521
@@ -561,15 +525,15 @@ class _AndroidViewGestureRecognizer extends OneSequenceGestureRecognizer {
561
525
cachedEvents.remove (pointer);
562
526
}
563
527
564
- void cacheEvent (PointerEvent event) {
528
+ void _cacheEvent (PointerEvent event) {
565
529
if (! cachedEvents.containsKey (event.pointer)) {
566
530
cachedEvents[event.pointer] = < PointerEvent > [];
567
531
}
568
532
cachedEvents[event.pointer].add (event);
569
533
}
570
534
571
- void flushPointerCache (int pointer) {
572
- cachedEvents.remove (pointer)? .forEach (dispatcher.handlePointerEvent );
535
+ void _flushPointerCache (int pointer) {
536
+ cachedEvents.remove (pointer)? .forEach (_handlePointerEvent );
573
537
}
574
538
575
539
@override
@@ -728,18 +692,24 @@ class _MotionEventsDispatcher {
728
692
729
693
/// A render object for embedding a platform view.
730
694
///
731
- /// [PlatformViewRenderBox] presents a platform view by adding a [PlatformViewLayer] layer, integrates it with the gesture arenas system
732
- /// and adds relevant semantic nodes to the semantics tree.
733
- class PlatformViewRenderBox extends RenderBox {
695
+ /// [PlatformViewRenderBox] presents a platform view by adding a [PlatformViewLayer] layer,
696
+ /// integrates it with the gesture arenas system and adds relevant semantic nodes to the semantics tree.
697
+ class PlatformViewRenderBox extends RenderBox with _PlatformViewGestureMixin {
734
698
735
699
/// Creating a render object for a [PlatformViewSurface] .
736
700
///
737
701
/// The `controller` parameter must not be null.
738
702
PlatformViewRenderBox ({
739
703
@required PlatformViewController controller,
740
-
741
- }) : assert (controller != null && controller.viewId != null && controller.viewId > - 1 ),
742
- _controller = controller;
704
+ @required PlatformViewHitTestBehavior hitTestBehavior,
705
+ @required Set <Factory <OneSequenceGestureRecognizer >> gestureRecognizers,
706
+ }) : assert (controller != null && controller.viewId != null && controller.viewId > - 1 ),
707
+ assert (hitTestBehavior != null ),
708
+ assert (gestureRecognizers != null ),
709
+ _controller = controller {
710
+ this .hitTestBehavior = hitTestBehavior;
711
+ updateGestureRecognizers (gestureRecognizers);
712
+ }
743
713
744
714
/// Sets the [controller] for this render object.
745
715
///
@@ -759,6 +729,19 @@ class PlatformViewRenderBox extends RenderBox {
759
729
}
760
730
}
761
731
732
+ /// How to behave during hit testing.
733
+ // The implicit setter is enough here as changing this value will just affect
734
+ // any newly arriving events there's nothing we need to invalidate.
735
+ // PlatformViewHitTestBehavior hitTestBehavior;
736
+
737
+ /// {@macro flutter.rendering.platformView.updateGestureRecognizers}
738
+ ///
739
+ /// Any active gesture arena the `PlatformView` participates in is rejected when the
740
+ /// set of gesture recognizers is changed.
741
+ void updateGestureRecognizers (Set <Factory <OneSequenceGestureRecognizer >> gestureRecognizers) {
742
+ _updateGestureRecognizersWithCallBack (gestureRecognizers, _controller.dispatchPointerEvent);
743
+ }
744
+
762
745
PlatformViewController _controller;
763
746
764
747
@override
@@ -791,3 +774,56 @@ class PlatformViewRenderBox extends RenderBox {
791
774
config.platformViewId = _controller.viewId;
792
775
}
793
776
}
777
+
778
+ /// The Mixin handling the pointer events and gestures of a platform view render box.
779
+ mixin _PlatformViewGestureMixin on RenderBox {
780
+
781
+ /// How to behave during hit testing.
782
+ // The implicit setter is enough here as changing this value will just affect
783
+ // any newly arriving events there's nothing we need to invalidate.
784
+ PlatformViewHitTestBehavior hitTestBehavior;
785
+
786
+ /// {@macro flutter.rendering.platformView.updateGestureRecognizers}
787
+ ///
788
+ /// Any active gesture arena the `PlatformView` participates in is rejected when the
789
+ /// set of gesture recognizers is changed.
790
+ void _updateGestureRecognizersWithCallBack (Set <Factory <OneSequenceGestureRecognizer >> gestureRecognizers, _HandlePointerEvent _handlePointerEvent) {
791
+ assert (gestureRecognizers != null );
792
+ assert (
793
+ _factoriesTypeSet (gestureRecognizers).length == gestureRecognizers.length,
794
+ 'There were multiple gesture recognizer factories for the same type, there must only be a single '
795
+ 'gesture recognizer factory for each gesture recognizer type.' ,);
796
+ if (_factoryTypesSetEquals (gestureRecognizers, _gestureRecognizer? .gestureRecognizerFactories)) {
797
+ return ;
798
+ }
799
+ _gestureRecognizer? .dispose ();
800
+ _gestureRecognizer = _PlatformViewGestureRecognizer (_handlePointerEvent, gestureRecognizers);
801
+ }
802
+
803
+ _PlatformViewGestureRecognizer _gestureRecognizer;
804
+
805
+ @override
806
+ bool hitTest (BoxHitTestResult result, { Offset position }) {
807
+ if (hitTestBehavior == PlatformViewHitTestBehavior .transparent || ! size.contains (position)) {
808
+ return false ;
809
+ }
810
+ result.add (BoxHitTestEntry (this , position));
811
+ return hitTestBehavior == PlatformViewHitTestBehavior .opaque;
812
+ }
813
+
814
+ @override
815
+ bool hitTestSelf (Offset position) => hitTestBehavior != PlatformViewHitTestBehavior .transparent;
816
+
817
+ @override
818
+ void handleEvent (PointerEvent event, HitTestEntry entry) {
819
+ if (event is PointerDownEvent ) {
820
+ _gestureRecognizer.addPointer (event);
821
+ }
822
+ }
823
+
824
+ @override
825
+ void detach () {
826
+ _gestureRecognizer.reset ();
827
+ super .detach ();
828
+ }
829
+ }
0 commit comments