Loading...
Loading...
Embeds native Android, iOS, or macOS views into a Flutter app. Use when integrating complex native components like maps or web views.
npx skill4agent add flutter/skills flutter-embedding-native-viewsSurfaceFlingerSurfaceViewTextureViewUIViewShaderMaskColorFilteredBackdropFilterNSViewiframedivmultiViewEnabled: trueapp.addView()app.removeView()runApprunWidgetWidgetsBinding.instance.platformDispatcher.viewsViewCollectionViewPlatformViewLinkAndroidViewSurfacePlatformViewsService.initSurfaceAndroidViewAndroidViewio.flutter.plugin.platform.PlatformViewandroid.view.ViewPlatformViewFactoryMainActivity.ktflutterEngine.platformViewsController.registry.registerViewFactorySurfaceViewSurfaceTextureinvalidateUiKitViewFlutterPlatformViewFlutterPlatformViewFactoryAppDelegate.swiftflutter_bootstrap.jsmain.dartrunWidgetViewCollectionflutter_bootstrap.jsmultiViewEnabled: trueappapp.addView({ hostElement: document.getElementById('my-div') })runApp()runWidget()WidgetsBindingObserver.didChangeMetricsWidgetsBinding.instance.platformDispatcher.viewsViewFlutterViewViewCollectionimport 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class NativeAndroidView extends StatelessWidget {
Widget build(BuildContext context) {
const String viewType = 'my_native_view';
final Map<String, dynamic> creationParams = <String, dynamic>{};
return AndroidView(
viewType: viewType,
layoutDirection: TextDirection.ltr,
creationParams: creationParams,
creationParamsCodec: const StandardMessageCodec(),
);
}
}_flutter.loader.load({
onEntrypointLoaded: async function(engineInitializer) {
let engine = await engineInitializer.initializeEngine({
multiViewEnabled: true,
});
let app = await engine.runApp();
// Add a view to a specific DOM element
let viewId = app.addView({
hostElement: document.querySelector('#flutter-host-container'),
initialData: { customData: 'Hello from JS' }
});
}
});import 'dart:ui' show FlutterView;
import 'package:flutter/widgets.dart';
void main() {
runWidget(MultiViewApp(viewBuilder: (context) => const MyEmbeddedWidget()));
}
class MultiViewApp extends StatefulWidget {
final WidgetBuilder viewBuilder;
const MultiViewApp({super.key, required this.viewBuilder});
State<MultiViewApp> createState() => _MultiViewAppState();
}
class _MultiViewAppState extends State<MultiViewApp> with WidgetsBindingObserver {
Map<Object, Widget> _views = {};
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
_updateViews();
}
void didChangeMetrics() => _updateViews();
void _updateViews() {
final newViews = <Object, Widget>{};
for (final FlutterView view in WidgetsBinding.instance.platformDispatcher.views) {
newViews[view.viewId] = _views[view.viewId] ?? View(
view: view,
child: Builder(builder: widget.viewBuilder),
);
}
setState(() => _views = newViews);
}
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
Widget build(BuildContext context) {
return ViewCollection(views: _views.values.toList(growable: false));
}
}