|
| 1 | +import 'package:flutter/foundation.dart'; |
| 2 | +import 'package:flutter/gestures.dart'; |
| 3 | +import 'package:flutter/material.dart'; |
| 4 | +import 'package:flutter/rendering.dart'; |
| 5 | +import 'package:flutter/services.dart'; |
| 6 | + |
| 7 | +// https://github.com/flutter/flutter/issues/56181 |
| 8 | + |
| 9 | +class HtmlElementViewEx extends HtmlElementView { |
| 10 | + final PlatformViewCreatedCallback onPlatformViewCreated; //!!! |
| 11 | + final dynamic creationParams; |
| 12 | + |
| 13 | + const HtmlElementViewEx({Key? key, required String viewType, required this.onPlatformViewCreated, this.creationParams}) : super(key: key, viewType: viewType); |
| 14 | + |
| 15 | + @override |
| 16 | + Widget build(BuildContext context) => PlatformViewLink( |
| 17 | + viewType: viewType, |
| 18 | + onCreatePlatformView: _createHtmlElementView, |
| 19 | + surfaceFactory: (BuildContext context, PlatformViewController controller) => PlatformViewSurface( |
| 20 | + controller: controller, |
| 21 | + gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{}, |
| 22 | + hitTestBehavior: PlatformViewHitTestBehavior.opaque, |
| 23 | + ), |
| 24 | + ); |
| 25 | + |
| 26 | + _HtmlElementViewControllerEx _createHtmlElementView(PlatformViewCreationParams params) { |
| 27 | + final _HtmlElementViewControllerEx controller = _HtmlElementViewControllerEx(params.id, viewType); |
| 28 | + controller._initialize().then((_) { |
| 29 | + params.onPlatformViewCreated(params.id); |
| 30 | + onPlatformViewCreated(params.id); //!!! |
| 31 | + }); |
| 32 | + return controller; |
| 33 | + } |
| 34 | +} |
| 35 | + |
| 36 | +class _HtmlElementViewControllerEx extends PlatformViewController { |
| 37 | + @override |
| 38 | + final int viewId; |
| 39 | + final String viewType; |
| 40 | + bool _initialized = false; |
| 41 | + |
| 42 | + _HtmlElementViewControllerEx(this.viewId, this.viewType); |
| 43 | + |
| 44 | + Future<void> _initialize() async { |
| 45 | + await SystemChannels.platform_views.invokeMethod<void>('create', {'id': viewId, 'viewType': viewType}); |
| 46 | + _initialized = true; |
| 47 | + } |
| 48 | + |
| 49 | + @override |
| 50 | + Future<void> clearFocus() async {} |
| 51 | + |
| 52 | + @override |
| 53 | + Future<void> dispatchPointerEvent(PointerEvent event) async {} |
| 54 | + |
| 55 | + @override |
| 56 | + Future<void> dispose() async { |
| 57 | + if (_initialized) await SystemChannels.platform_views.invokeMethod<void>('dispose', viewId); |
| 58 | + } |
| 59 | +} |
0 commit comments