Created
February 21, 2025 09:55
-
-
Save jonasermert/9db38fa53c21a02ae1abd481661e5ca3 to your computer and use it in GitHub Desktop.
HTML WIdget
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:html' as html; | |
import 'dart:ui' as ui; | |
import 'package:flutter/foundation.dart'; | |
import 'package:flutter/gestures.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:flutter/rendering.dart'; | |
import 'package:flutter/services.dart'; | |
final Map<int, HtmlElementWidgetState> _widgetRef = {}; | |
abstract class HtmlElementWidget extends StatefulWidget { | |
const HtmlElementWidget({Key? key}) : super(key: key); | |
html.HtmlElement createHtmlElement(BuildContext context); | |
@override | |
HtmlElementWidgetState createState() => HtmlElementWidgetState(); | |
} | |
class HtmlElementWidgetState<T extends HtmlElementWidget> extends State<T> { | |
static bool _registered = false; | |
@override | |
void initState() { | |
super.initState(); | |
if (!_registered && kIsWeb) { | |
_registerPlatformView(); | |
_registered = true; | |
} | |
} | |
html.HtmlElement createHtmlElement(BuildContext context) { | |
return widget.createHtmlElement(context); | |
} | |
void _registerPlatformView() { | |
ui.platformViewRegistry.registerViewFactory( | |
'HtmlElementWidget', | |
(int viewId) { | |
final state = _widgetRef[viewId]; | |
assert(state != null, 'State should not be null'); | |
return state!.createHtmlElement(context); | |
}, | |
); | |
} | |
@override | |
Widget build(BuildContext context) { | |
return PlatformViewLink( | |
viewType: 'HtmlElementWidget', | |
onCreatePlatformView: (PlatformViewCreationParams params) { | |
_widgetRef[params.id] = this; | |
final controller = _HtmlElementViewController(params); | |
controller.initialize().then((_) { | |
params.onPlatformViewCreated(params.id); | |
}); | |
return controller; | |
}, | |
surfaceFactory: (context, controller) { | |
return PlatformViewSurface( | |
controller: controller, | |
gestureRecognizers: <Factory<OneSequenceGestureRecognizer>>{}, | |
hitTestBehavior: PlatformViewHitTestBehavior.opaque, | |
); | |
}, | |
); | |
} | |
} | |
class _HtmlElementViewController extends PlatformViewController { | |
_HtmlElementViewController(this.params); | |
final PlatformViewCreationParams params; | |
bool _initialized = false; | |
@override | |
int get viewId => params.id; | |
Future<void> initialize() async { | |
await SystemChannels.platform_views.invokeMethod<void>( | |
'create', | |
{'id': viewId, 'viewType': params.viewType}, | |
); | |
_initialized = true; | |
} | |
@override | |
Future<void> clearFocus() async { | |
} | |
@override | |
Future<void> dispatchPointerEvent(PointerEvent event) async { | |
} | |
@override | |
Future<void> dispose() async { | |
if (_initialized) { | |
await SystemChannels.platform_views.invokeMethod<void>('dispose', viewId); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment