From 7f9c5a0f2da4086f2ec490bee0409ceb85ae2f29 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 17 Oct 2023 08:55:49 +0800 Subject: [PATCH] (re)set rendering on all lifecycle changes --- lib/widgets/filament_widget.dart | 42 +++++++++++++++++--------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/lib/widgets/filament_widget.dart b/lib/widgets/filament_widget.dart index c03fdbac..763d6a09 100644 --- a/lib/widgets/filament_widget.dart +++ b/lib/widgets/filament_widget.dart @@ -168,8 +168,9 @@ class _SizedFilamentWidgetState extends State<_SizedFilamentWidget> { // debug mode does need a longer timeout. _resizeTimer?.cancel(); - _resizeTimer = Timer(const Duration(milliseconds: kReleaseMode ? 20 : 100), () async { - if(!mounted) { + _resizeTimer = + Timer(const Duration(milliseconds: kReleaseMode ? 20 : 100), () async { + if (!mounted) { return; } var size = ((context.findRenderObject()) as RenderBox).size; @@ -209,41 +210,42 @@ class _SizedFilamentWidgetState extends State<_SizedFilamentWidget> { switch (state) { case AppLifecycleState.detached: print("Detached"); - - if (widget.controller.textureDetails != null) { - await widget.controller.destroyViewer(); - await widget.controller.destroyTexture(); + if (!_wasRenderingOnInactive) { + _wasRenderingOnInactive = widget.controller.rendering; } + await widget.controller.setRendering(false); break; case AppLifecycleState.hidden: print("Hidden"); - if (Platform.isIOS && widget.controller.textureDetails != null) { - await widget.controller.destroyViewer(); - await widget.controller.destroyTexture(); + if (!_wasRenderingOnInactive) { + _wasRenderingOnInactive = widget.controller.rendering; } + await widget.controller.setRendering(false); break; case AppLifecycleState.inactive: print("Inactive"); + if (!_wasRenderingOnInactive) { + _wasRenderingOnInactive = widget.controller.rendering; + } // on Windows in particular, restoring a window after minimizing stalls the renderer (and the whole application) for a considerable length of time. // disabling rendering on minimize seems to fix the issue (so I wonder if there's some kind of command buffer that's filling up while the window is minimized). - _wasRenderingOnInactive = widget.controller.rendering; await widget.controller.setRendering(false); break; case AppLifecycleState.paused: print("Paused"); + if (!_wasRenderingOnInactive) { + _wasRenderingOnInactive = widget.controller.rendering; + } + await widget.controller.setRendering(false); break; case AppLifecycleState.resumed: print("Resumed"); - if (!Platform.isWindows) { - if (widget.controller.textureDetails == null) { - var size = ((context.findRenderObject()) as RenderBox).size; - widget.controller - .createViewer(size.width.ceil(), size.height.ceil()); - } - } else { - await _resize(); - } await widget.controller.setRendering(_wasRenderingOnInactive); + await _resize(); + WidgetsBinding.instance.addPostFrameCallback((_) { + setState(() {}); + }); + break; } _lastState = state; @@ -274,7 +276,7 @@ class _SizedFilamentWidgetState extends State<_SizedFilamentWidget> { return Stack(children: [ Positioned.fill( - child: Platform.isLinux || Platform.isWindows + child: Platform.isLinux || Platform.isWindows ? Transform( alignment: Alignment.center, transform: Matrix4.rotationX(