Embedding native windows & components directly into Flutter window (no texture, no intermediate buffers, no copying, just performance). π
In future, I will create natively rendered, performant & less-bundle-sized webview & video playback plugins. Currently I'm only targetting Windows to limit the scope of work.
Try running the example application by cloning the repository.
video.mp4
A Flutter plugin / C++ library to embed other native Windows (HWND
on Windows) into Flutter window.
Current API design allows to embed any arbitrary HWND
completely from Dart as a Widget
. This can be a good choice when client code wants to embed any arbitrary third-party window (which is already opened) into the Flutter window.
However, this is not ideal in most cases because there is almost no point of embedding a third-party window directly (which will lack programmatic control via some API).
On the other hand, a window created by the client code itself e.g. a webview instance window or a video-output window etc. (on which the client code has full programmatic control) will be an ideal window to embed, in that case:
- If client code decides to create an
HWND
through platform channel interface, they can use the setup present incore
to embed a window. - Since
dart:ffi
is very capable now, one can pass theHWND
directly asint
of the window they created usingdart:ffi
orwin32
through existing plugin API to embed it.
Absence of official Platform View APIs in Flutter for Windows, Linux & macOS.
You may sponsor this project at Patreon or make voluntary donations at PayPal. It'll be a great motivation for me.
- Ahmad Arif Aulia Sutarman β 20$
Add following lines to your windows/runner/main.cpp
file:
#include <flutter/dart_project.h>
#include <flutter/flutter_view_controller.h>
#include <windows.h>
+ #include "flutter_native_view/flutter_native_view_plugin.h"
#include "flutter_window.h"
#include "utils.h"
window.SetQuitOnClose(true);
+ flutternativeview::CreateNativeViewContainer();
::MSG msg;
while (::GetMessage(&msg, nullptr, 0, 0)) {
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await FlutterNativeView.ensureInitialized();
runApp(const MyApp());
}
class _MyAppState extends State<MyApp> {
/// Create a [NativeViewController].
final controller = NativeViewController(
/// Using [FindWindow] from `package:win32` to retrieve `HWND` as [int].
handle: FindWindow(nullptr, 'VLC Media Player'.toNativeUtf16()));
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Padding(
padding: const EdgeInsets.all(24.0),
child: Stack(
children: [
LayoutBuilder(
builder: (context, constraints) => NativeView(
/// Pass [NativeViewController] to render the window.
controller: controller,
width: constraints.maxWidth,
height: constraints.maxHeight,
),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: FloatingActionButton(
onPressed: () {},
child: const Icon(Icons.edit),
),
),
],
),
),
),
),
),
);
}
}
- Placement of other Flutter
Widget
s on top of theNativeView
. - Multiple instances of
NativeView
. - Window movement handling &
NativeView
s positioning. - Window resize handling &
NativeView
s sizing. - Windows 10 & higher support.
- Proper disposing of
HWND
and instances. - Semi transparent
Widget
s on top ofNativeView
. - Customizable hit-test i.e. optional interactability with the
NativeView
s.
- Finalized API.
- Better maximize/minimize animations.
- Support for older Windows versions.
- Efficient redraws of child windows.
- Removing Win32 specific types &
ifdef
magic. - Defining z-order for each
NativeViewController
.
The plugin currently works on following platforms:
Platform | State |
---|---|
Windows | Working |
Currently licensing strictly.
GNU General Public License v3.0
Copyright (C) 2021, Hitesh Kumar Saini <[email protected]>