Skip to content

Instantly share code, notes, and snippets.

@jonasermert
Created February 21, 2025 09:55
Show Gist options
  • Save jonasermert/9db38fa53c21a02ae1abd481661e5ca3 to your computer and use it in GitHub Desktop.
Save jonasermert/9db38fa53c21a02ae1abd481661e5ca3 to your computer and use it in GitHub Desktop.
HTML WIdget
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