From 0b17dc26e8ef79b82d495a55edf648c87f993d64 Mon Sep 17 00:00:00 2001 From: DatDang Date: Thu, 31 Jul 2025 13:45:03 +0700 Subject: [PATCH] TF-3924 Thread Detail Memory leak resolve --- .../lib/presentation/utils/shims/dart_ui.dart | 10 ------ .../utils/shims/dart_ui_fake.dart | 21 ------------ .../utils/shims/dart_ui_real.dart | 5 --- .../html_content_viewer_on_web_widget.dart | 32 ++++++++----------- .../presentation/composer_bindings.dart | 1 + .../calendar_event_interactor_bindings.dart | 13 ++++++++ .../bindings/mdn_interactor_bindings.dart | 8 +++++ .../controller/single_email_controller.dart | 3 ++ 8 files changed, 38 insertions(+), 55 deletions(-) delete mode 100644 core/lib/presentation/utils/shims/dart_ui.dart delete mode 100644 core/lib/presentation/utils/shims/dart_ui_fake.dart delete mode 100644 core/lib/presentation/utils/shims/dart_ui_real.dart diff --git a/core/lib/presentation/utils/shims/dart_ui.dart b/core/lib/presentation/utils/shims/dart_ui.dart deleted file mode 100644 index 3567e0f26..000000000 --- a/core/lib/presentation/utils/shims/dart_ui.dart +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2019 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -/// This file shims dart:ui in web-only scenarios, getting rid of the need to -/// suppress analyzer warnings. - -// TODO(): flutter/flutter#55000 Remove this file once web-only dart:ui APIs -// are exposed from a dedicated place. -export 'dart_ui_fake.dart' if (dart.library.html) 'dart_ui_real.dart'; diff --git a/core/lib/presentation/utils/shims/dart_ui_fake.dart b/core/lib/presentation/utils/shims/dart_ui_fake.dart deleted file mode 100644 index 386e46e01..000000000 --- a/core/lib/presentation/utils/shims/dart_ui_fake.dart +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2019 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Fake interface for the logic that this package needs from (web-only) dart:ui. -// This is conditionally exported so the analyzer sees these methods as available. - -/// Shim for web_ui engine.PlatformViewRegistry -/// https://github.com/flutter/engine/blob/master/lib/web_ui/lib/ui.dart#L62 -// ignore: camel_case_types -class platformViewRegistry { - /// Shim for registerViewFactory - /// https://github.com/flutter/engine/blob/master/lib/web_ui/lib/ui.dart#L72 - static void registerViewFactory( - String viewTypeId, dynamic Function(int viewId) viewFactory) {} -} - -/// Signature of callbacks that have no arguments and return no data. -typedef VoidCallback = void Function(); - -dynamic get window => null; diff --git a/core/lib/presentation/utils/shims/dart_ui_real.dart b/core/lib/presentation/utils/shims/dart_ui_real.dart deleted file mode 100644 index 2cd8a4def..000000000 --- a/core/lib/presentation/utils/shims/dart_ui_real.dart +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright 2019 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -export 'dart:ui_web'; diff --git a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart index 84ee937ac..2f66dc8f7 100644 --- a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart +++ b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart @@ -4,7 +4,6 @@ import 'dart:math' as math; import 'package:core/presentation/constants/constants_ui.dart'; import 'package:core/presentation/extensions/color_extension.dart'; -import 'package:core/presentation/utils/shims/dart_ui.dart' as ui; import 'package:core/utils/app_logger.dart'; import 'package:core/utils/html/html_interaction.dart'; import 'package:core/utils/html/html_template.dart'; @@ -370,22 +369,7 @@ class _HtmlContentViewerOnWebState extends State _createdViewId = _getRandString(10); _htmlData = _generateHtmlDocument(widget.contentHtml); - final iframe = html.IFrameElement() - ..width = _actualWidth.toString() - ..height = _actualHeight.toString() - ..srcdoc = _htmlData ?? '' - ..style.border = 'none' - ..style.overflow = 'hidden' - ..style.width = '100%' - ..style.height = '100%'; - - ui.platformViewRegistry.registerViewFactory(_createdViewId, (int viewId) => iframe); - - if (mounted) { - setState(() { - _webInit = Future.value(true); - }); - } + _webInit = Future.value(true); } @override @@ -413,9 +397,19 @@ class _HtmlContentViewerOnWebState extends State future: _webInit, builder: (_, snapshot) { if (snapshot.hasData) { - final htmlView = HtmlElementView( + final htmlView = HtmlElementView.fromTagName( key: ValueKey('$_htmlData-${widget.key}'), - viewType: _createdViewId, + tagName: 'iframe', + onElementCreated: (element) { + (element as html.IFrameElement) + ..width = _actualWidth.toString() + ..height = _actualHeight.toString() + ..srcdoc = _htmlData ?? '' + ..style.border = 'none' + ..style.overflow = 'hidden' + ..style.width = '100%' + ..style.height = '100%'; + }, ); if (widget.viewMaxHeight != null) { diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index 7d7692100..27cc6b6ad 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -400,6 +400,7 @@ class ComposerBindings extends BaseBindings { Get.delete(tag: composerId); Get.delete(tag: composerId); Get.delete(tag: composerId); + Get.delete(tag: composerId); IdentityInteractorsBindings(composerId: composerId).dispose(); PreferencesInteractorsBindings(composerId: composerId).dispose(); diff --git a/lib/features/email/presentation/bindings/calendar_event_interactor_bindings.dart b/lib/features/email/presentation/bindings/calendar_event_interactor_bindings.dart index ed9508c0c..407c45f68 100644 --- a/lib/features/email/presentation/bindings/calendar_event_interactor_bindings.dart +++ b/lib/features/email/presentation/bindings/calendar_event_interactor_bindings.dart @@ -58,4 +58,17 @@ class CalendarEventInteractorBindings extends InteractorsBindings { Get.find(), )); } + + void dispose() { + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + } } \ No newline at end of file diff --git a/lib/features/email/presentation/bindings/mdn_interactor_bindings.dart b/lib/features/email/presentation/bindings/mdn_interactor_bindings.dart index 15d67e487..59f0265d0 100644 --- a/lib/features/email/presentation/bindings/mdn_interactor_bindings.dart +++ b/lib/features/email/presentation/bindings/mdn_interactor_bindings.dart @@ -34,4 +34,12 @@ class MdnInteractorBindings extends InteractorsBindings { void bindingsRepositoryImpl() { Get.lazyPut(() => MdnRepositoryImpl(Get.find())); } + + void dispose() { + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + Get.delete(); + } } \ No newline at end of file diff --git a/lib/features/email/presentation/controller/single_email_controller.dart b/lib/features/email/presentation/controller/single_email_controller.dart index 8c4e83474..2ad22a584 100644 --- a/lib/features/email/presentation/controller/single_email_controller.dart +++ b/lib/features/email/presentation/controller/single_email_controller.dart @@ -93,6 +93,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/send_receipt_to_sen import 'package:tmail_ui_user/features/email/domain/usecases/store_opened_email_interactor.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; import 'package:tmail_ui_user/features/email/presentation/bindings/calendar_event_interactor_bindings.dart'; +import 'package:tmail_ui_user/features/email/presentation/bindings/mdn_interactor_bindings.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/attachment_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_attendee_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/extensions/calendar_organizer_extension.dart'; @@ -265,6 +266,8 @@ class SingleEmailController extends BaseController with AppLoaderMixin { _downloadProgressStateController.close(); _attachmentListScrollController.dispose(); emailScrollController.dispose(); + CalendarEventInteractorBindings().dispose(); + MdnInteractorBindings().dispose(); super.onClose(); }