move ThermionFlutterWebOptions to platform_interface package
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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,
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user