move ThermionFlutterWebOptions to platform_interface package

This commit is contained in:
Nick Fisher
2025-05-15 16:53:19 +08:00
parent 11ff6c9053
commit c53266f12f
6 changed files with 68 additions and 73 deletions

View File

@@ -3,7 +3,6 @@ import 'package:flutter/material.dart' hide View;
import 'package:thermion_flutter/src/widgets/src/thermion_texture_widget.dart'; import 'package:thermion_flutter/src/widgets/src/thermion_texture_widget.dart';
import 'package:thermion_flutter/src/widgets/src/thermion_widget_web.dart'; import 'package:thermion_flutter/src/widgets/src/thermion_widget_web.dart';
import 'package:thermion_flutter/thermion_flutter.dart'; import 'package:thermion_flutter/thermion_flutter.dart';
import 'package:thermion_flutter_web/thermion_flutter_web_options.dart';
Future kDefaultResizeCallback(Size size, View view, double pixelRatio) async { Future kDefaultResizeCallback(Size size, View view, double pixelRatio) async {
var camera = await view.getCamera(); var camera = await view.getCamera();
@@ -67,8 +66,10 @@ class _ThermionWidgetState extends State<ThermionWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (kIsWeb) { if (kIsWeb) {
var options = ThermionFlutterPlatform.instance.options as ThermionFlutterWebOptions;
return ThermionWidgetWeb( return ThermionWidgetWeb(
viewer: widget.viewer, options: const ThermionFlutterWebOptions(importCanvasAsWidget: true)); viewer: widget.viewer,
options: options);
} }
return ThermionTextureWidget( return ThermionTextureWidget(

View File

@@ -1,13 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'dart:ui_web' as ui_web; import 'dart:ui_web' as ui_web;
import 'package:flutter/material.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:thermion_flutter/thermion_flutter.dart'; import 'package:thermion_flutter/thermion_flutter.dart';
import 'package:thermion_flutter_web/thermion_flutter_web.dart'; import 'package:thermion_flutter_web/thermion_flutter_web.dart';
import 'package:thermion_flutter_web/thermion_flutter_web_options.dart';
import 'package:web/web.dart' as web; import 'package:web/web.dart' as web;
import 'package:flutter/widgets.dart';
import 'resize_observer.dart'; import 'resize_observer.dart';
class ThermionWidgetWeb extends StatefulWidget { class ThermionWidgetWeb extends StatefulWidget {
@@ -52,15 +50,22 @@ class _ThermionWidgetWebState extends State<ThermionWidgetWeb> {
}); });
} }
void _resize(Size oldSize, Size newSize) async {
var width = newSize.width.toInt();
var height = newSize.height.toInt();
ThermionFlutterWebPlugin.instance
.resizeCanvas(newSize.width, newSize.height);
await widget.viewer.setViewport(width, height);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (widget.options.importCanvasAsWidget) { return ResizeObserver(
return _ImageCopyingWidget(viewer: widget.viewer); onResized: _resize,
// return _PlatformView( child: widget.options.importCanvasAsWidget
// viewer: widget.viewer, ? _ImageCopyingWidget(viewer: widget.viewer)
// ); : SizedBox.expand(
} child: Container(color: const Color(0x00000000))));
return Container(color: const Color(0x00000000));
} }
} }
@@ -73,42 +78,27 @@ class _PlatformView extends StatefulWidget {
} }
class _PlatformViewState extends State<_PlatformView> { class _PlatformViewState extends State<_PlatformView> {
void initState() { void initState() {
super.initState(); super.initState();
ui_web.platformViewRegistry.registerViewFactory( ui_web.platformViewRegistry.registerViewFactory(
'imported-canvas', 'imported-canvas',
(int viewId, {Object? params}) { (int viewId, {Object? params}) {
var canvas = web.document.getElementById("thermion_canvas"); var canvas = web.document.getElementById("thermion_canvas");
WidgetsBinding.instance.addPostFrameCallback((_) {
var renderBox = this.context.findRenderObject() as RenderBox?;
_resize(Size(0, 0), renderBox!.size);
});
return canvas! as Object; return canvas! as Object;
}, },
); );
} }
void _resize(Size oldSize, Size newSize) {
var width = newSize.width.toInt();
var height = newSize.height.toInt();
ThermionFlutterWebPlugin.instance
.resizeCanvas(newSize.width, newSize.height);
widget.viewer.setViewport(width, height);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ResizeObserver( return HtmlElementView(
onResized: _resize,
child: HtmlElementView(
viewType: 'imported-canvas', viewType: 'imported-canvas',
onPlatformViewCreated: (i) {}, onPlatformViewCreated: (i) {},
creationParams: <String, Object?>{ creationParams: <String, Object?>{
'key': 'someValue', 'key': 'someValue',
}, },
)); );
} }
} }
@@ -142,17 +132,27 @@ class _ImageCopyingWidgetState extends State<_ImageCopyingWidget> {
try { try {
final rb = this.context.findRenderObject() as RenderBox?; final rb = this.context.findRenderObject() as RenderBox?;
if (_resizing || rb == null || rb.size.isEmpty) { if (rb == null) {
setState(() {}); setState(() {});
return; return;
} }
if (rb.size.isEmpty) {
setState(() {});
return;
}
// if (_resizing) {
// setState(() {});
// return;
// }
if (canvas.width != rb.size.width || canvas.height != rb.size.height) { if (canvas.width != rb.size.width || canvas.height != rb.size.height) {
ThermionFlutterWebPlugin.instance // ThermionFlutterWebPlugin.instance
.resizeCanvas(rb.size.width, rb.size.height); // .resizeCanvas(rb.size.width, rb.size.height);
await widget.viewer // await widget.viewer
.setViewport(rb.size.width.ceil(), rb.size.height.ceil()) // .setViewport(rb.size.width.ceil(), rb.size.height.ceil())
.timeout(Duration(seconds: 1)); // .timeout(Duration(seconds: 1));
} }
width = canvas.width * web.window.devicePixelRatio; width = canvas.width * web.window.devicePixelRatio;
@@ -173,16 +173,16 @@ class _ImageCopyingWidgetState extends State<_ImageCopyingWidget> {
int _request = 0; int _request = 0;
bool _resizing = false; // bool _resizing = false;
Timer? _resizeTimer; // Timer? _resizeTimer;
void _resize(Size oldSize, Size newSize) { // void _resize(Size oldSize, Size newSize) {
_resizeTimer?.cancel(); // _resizeTimer?.cancel();
_resizing = true; // _resizing = true;
_resizeTimer = Timer(Duration(milliseconds: 100), () { // _resizeTimer = Timer(Duration(milliseconds: 100), () {
_resizing = false; // _resizing = false;
}); // });
} // }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -190,15 +190,13 @@ class _ImageCopyingWidgetState extends State<_ImageCopyingWidget> {
return Container(); return Container();
} }
return ResizeObserver( return RawImage(
onResized: _resize, key: Key(_request.toString()),
child: RawImage( width: width,
key: Key(_request.toString()), height: height,
width: width, image: _img!,
height: height, filterQuality: FilterQuality.high,
image: _img!, isAntiAlias: false,
filterQuality: FilterQuality.high, );
isAntiAlias: false,
));
} }
} }

View File

@@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:thermion_flutter/thermion_flutter.dart'; import 'package:thermion_flutter/thermion_flutter.dart';
import 'package:thermion_flutter_web/thermion_flutter_web_options.dart';
class ThermionWidgetWeb extends StatelessWidget { class ThermionWidgetWeb extends StatelessWidget {
final ThermionFlutterWebOptions? options; final ThermionFlutterWebOptions? options;

View File

@@ -12,6 +12,20 @@ class ThermionFlutterOptions {
{this.uberarchivePath = null, this.backend = null}); {this.uberarchivePath = null, this.backend = null});
} }
class ThermionFlutterWebOptions extends ThermionFlutterOptions {
final bool createCanvas;
final bool importCanvasAsWidget;
const ThermionFlutterWebOptions(
{this.importCanvasAsWidget = false,
this.createCanvas = true,
String? uberarchivePath})
: super(uberarchivePath: uberarchivePath);
}
abstract class ThermionFlutterPlatform extends PlatformInterface { abstract class ThermionFlutterPlatform extends PlatformInterface {
ThermionFlutterPlatform() : super(token: _token); ThermionFlutterPlatform() : super(token: _token);

View File

@@ -6,9 +6,7 @@ import 'package:flutter/services.dart';
import 'package:thermion_dart/thermion_dart.dart'; import 'package:thermion_dart/thermion_dart.dart';
import 'package:thermion_dart/src/filament/src/implementation/ffi_filament_app.dart'; import 'package:thermion_dart/src/filament/src/implementation/ffi_filament_app.dart';
import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart'; import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart';
import 'package:thermion_flutter_web/thermion_flutter_web_options.dart';
import 'package:web/web.dart'; import 'package:web/web.dart';
class ThermionFlutterWebPlugin extends ThermionFlutterPlatform { class ThermionFlutterWebPlugin extends ThermionFlutterPlatform {

View File

@@ -1,15 +0,0 @@
import 'package:thermion_flutter_platform_interface/thermion_flutter_platform_interface.dart';
class ThermionFlutterWebOptions extends ThermionFlutterOptions {
final bool createCanvas;
final bool importCanvasAsWidget;
const ThermionFlutterWebOptions(
{this.importCanvasAsWidget = false,
this.createCanvas = true,
String? uberarchivePath})
: super(uberarchivePath: uberarchivePath);
}