diff --git a/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart b/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart index bb2b89b3ae0b9..3b64dbb594721 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/embedded_views.dart @@ -410,8 +410,7 @@ class HtmlViewEmbedder { // are going to be added back. Moving rather than removing and re-adding // the view helps it maintain state. disposeViews(diffResult.viewsToRemove - .where((int view) => !diffResult.viewsToAdd.contains(view)) - .toSet()); + .where((int view) => !diffResult.viewsToAdd.contains(view))); _activeCompositionOrder.addAll(_compositionOrder); unusedViews.removeAll(_compositionOrder); @@ -510,7 +509,7 @@ class HtmlViewEmbedder { ); } - void disposeViews(Set viewsToDispose) { + void disposeViews(Iterable viewsToDispose) { for (final int viewId in viewsToDispose) { // Remove viewId from the _viewClipChains Map, and then from the DOM. final ViewClipChain? clipChain = _viewClipChains.remove(viewId); @@ -659,8 +658,7 @@ class HtmlViewEmbedder { /// Disposes the state of this view embedder. void dispose() { - final Set allViews = PlatformViewManager.instance.debugClear(); - disposeViews(allViews); + disposeViews(_viewClipChains.keys); _context = EmbedderFrameContext(); _currentCompositionParams.clear(); debugCleanupSvgClipPaths(); diff --git a/lib/web_ui/lib/src/engine/platform_views/content_manager.dart b/lib/web_ui/lib/src/engine/platform_views/content_manager.dart index bfad69bf911b8..c09eefcc18972 100644 --- a/lib/web_ui/lib/src/engine/platform_views/content_manager.dart +++ b/lib/web_ui/lib/src/engine/platform_views/content_manager.dart @@ -213,16 +213,12 @@ class PlatformViewManager { bool isVisible(int viewId) => !isInvisible(viewId); /// Clears the state. Used in tests. - /// - /// Returns the set of know view ids, so they can be cleaned up. - Set debugClear() { - final Set result = _contents.keys.toSet(); - result.forEach(clearPlatformView); + void debugClear() { + _contents.keys.toList().forEach(clearPlatformView); _factories.clear(); _contents.clear(); _invisibleViews.clear(); _viewIdToType.clear(); - return result; } } diff --git a/lib/web_ui/test/canvaskit/multi_view_test.dart b/lib/web_ui/test/canvaskit/multi_view_test.dart index 3bc93153babf2..62b499226e75c 100644 --- a/lib/web_ui/test/canvaskit/multi_view_test.dart +++ b/lib/web_ui/test/canvaskit/multi_view_test.dart @@ -6,6 +6,7 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'package:ui/ui_web/src/ui_web.dart' as ui_web; import '../common/matchers.dart'; import 'common.dart'; @@ -68,5 +69,28 @@ void testMain() { isNull, ); }); + + // Issue https://github.com/flutter/flutter/issues/142094 + test('does not reset platform view factories when disposing a view', () async { + expect(PlatformViewManager.instance.knowsViewType('self-test'), isFalse); + + final EngineFlutterView view = EngineFlutterView( + EnginePlatformDispatcher.instance, createDomElement('multi-view')); + EnginePlatformDispatcher.instance.viewManager.registerView(view); + expect( + CanvasKitRenderer.instance.debugGetRasterizerForView(view), + isNotNull, + ); + + EnginePlatformDispatcher.instance.viewManager + .disposeAndUnregisterView(view.viewId); + expect( + CanvasKitRenderer.instance.debugGetRasterizerForView(view), + isNull, + ); + + expect(PlatformViewManager.instance.knowsViewType(ui_web.PlatformViewRegistry.defaultVisibleViewType), isTrue); + expect(PlatformViewManager.instance.knowsViewType(ui_web.PlatformViewRegistry.defaultInvisibleViewType), isTrue); + }); }); }