Skip to content

Commit

Permalink
Fix/free dependents (#1142)
Browse files Browse the repository at this point in the history
* ✨ feat: add deactivate to deactivate flutter element of kraken.

* ✨ feat: add deactivate to WidgetElement.

* 🎨 chore: format.

* ✨ feat: add list of widgetElement.

* ✨ feat: add function to control list of WidgetElement.

* ✨ feat: init widgetElements.

* ✨ feat: treverse widget element to deactivate.

* ✨ feat: add wiget element to list when _attachWidget.

* 🎨 chore: modify type of widgetElements.

* 🎨 chore: modify widgetElements.

* 🎨 chore: del sa.

* 🎨 chore: add comment.

* ✨ feat: add deactivateWidgetElements.

* 🎨 chore: modify removeWidgetElement to _removeWidgetElement.

* 🎨 chore: remove _clearWidgetElements.

* 🎨 chore: remove _removeWidgetElement to _removeTarget.

* 🎨 chore: add comment.
  • Loading branch information
answershuto committed Feb 9, 2022
1 parent 1793d90 commit 37c86ed
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 4 deletions.
25 changes: 24 additions & 1 deletion kraken/lib/src/launcher/controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@ class KrakenViewController
disposePage(_contextId);

_clearTargets();

document.dispose();
window.dispose();
_disposed = true;
Expand All @@ -279,6 +280,23 @@ class KrakenViewController
return null;
}

// Save all WidgetElement to manager life cycle.
final List<WidgetElement> _widgetElements = [];

void deactivateWidgetElements() {
_widgetElements.forEach((element) {
element.deactivate();
});
}

void addWidgetElement(WidgetElement widgetElement) {
_widgetElements.add(widgetElement);
}

void _removeWidgetElement(WidgetElement widgetElement) {
_widgetElements.remove(widgetElement);
}

T? _getEventTargetById<T>(int targetId) {
EventTarget? target = _eventTargets[targetId];
if (target is T)
Expand All @@ -293,7 +311,11 @@ class KrakenViewController

void _removeTarget(int targetId) {
if (_eventTargets.containsKey(targetId)) {
_eventTargets.remove(targetId);
EventTarget? target = _eventTargets.remove(targetId);

if (target is WidgetElement) {
_removeWidgetElement(target);
}
}
}

Expand All @@ -304,6 +326,7 @@ class KrakenViewController
void _clearTargets() {
// Set current eventTargets to a new object, clean old targets by gc.
_eventTargets = <int, EventTarget>{};
_widgetElements.clear();
}

// export Uint8List bytes from rendered result.
Expand Down
8 changes: 8 additions & 0 deletions kraken/lib/src/widget/kraken.dart
Original file line number Diff line number Diff line change
Expand Up @@ -878,6 +878,14 @@ class _KrakenState extends State<Kraken> with RouteAware {
}
return result;
}

@override
void deactivate() {
// Deactivate all WidgetElements in Kraken when Kraken Widget is deactivated.
widget.controller!.view.deactivateWidgetElements();

super.deactivate();
}
}

class _KrakenRenderObjectWidget extends SingleChildRenderObjectWidget {
Expand Down
18 changes: 15 additions & 3 deletions kraken/lib/src/widget/widget_to_element_adaptor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -247,11 +247,13 @@ abstract class WidgetElement extends dom.Element {
RenderObjectElement rootFlutterElement = ownerDocument.controller.rootFlutterElement;

KrakenRenderObjectToWidgetAdapter adaptor = KrakenRenderObjectToWidgetAdapter(
child: widget,
container: renderBoxModel as ContainerRenderObjectMixin<RenderBox,
ContainerBoxParentData<RenderBox>>
child: widget,
container: renderBoxModel as ContainerRenderObjectMixin<RenderBox,
ContainerBoxParentData<RenderBox>>
);

ownerDocument.controller.view.addWidgetElement(this);

Element? parentFlutterElement;
if (parentNode is WidgetElement) {
parentFlutterElement = (parentNode as WidgetElement).renderObjectElement;
Expand All @@ -261,6 +263,16 @@ abstract class WidgetElement extends dom.Element {

renderObjectElement = adaptor.attachToRenderTree(rootFlutterElement.owner!, (parentFlutterElement ?? rootFlutterElement) as RenderObjectElement, parentFlutterElement == null);
}

void deactivate() {
assert(renderObjectElement != null);
deactivateRecursively(renderObjectElement!);
}

void deactivateRecursively(Element element) {
element.deactivate();
element.visitChildren(deactivateRecursively);
}
}

class _KrakenAdapterWidget extends StatefulWidget {
Expand Down

0 comments on commit 37c86ed

Please sign in to comment.