Browse Source

fix: rebuilding node widgets when the subtype changes

Lucas.Xu 2 years ago
parent
commit
1039c5517f

+ 9 - 4
frontend/app_flowy/packages/flowy_editor/lib/document/node.dart

@@ -13,8 +13,9 @@ class Node extends ChangeNotifier with LinkedListEntry<Node> {
   String? get subtype {
   String? get subtype {
     // TODO: make 'subtype' as a const value.
     // TODO: make 'subtype' as a const value.
     if (attributes.containsKey('subtype')) {
     if (attributes.containsKey('subtype')) {
-      assert(attributes['subtype'] is String, 'subtype must be a [String]');
-      return attributes['subtype'] as String;
+      assert(attributes['subtype'] is String?,
+          'subtype must be a [String] or [null]');
+      return attributes['subtype'] as String?;
     }
     }
     return null;
     return null;
   }
   }
@@ -63,12 +64,16 @@ class Node extends ChangeNotifier with LinkedListEntry<Node> {
   }
   }
 
 
   void updateAttributes(Attributes attributes) {
   void updateAttributes(Attributes attributes) {
+    bool shouldNotifyParent =
+        this.attributes['subtype'] != attributes['subtype'];
+
     for (final attribute in attributes.entries) {
     for (final attribute in attributes.entries) {
       this.attributes[attribute.key] = attribute.value;
       this.attributes[attribute.key] = attribute.value;
     }
     }
-
     // Notify the new attributes
     // Notify the new attributes
-    parent?.notifyListeners();
+    // if attributes contains 'subtype', should notify parent to rebuild node
+    // else, just notify current node.
+    shouldNotifyParent ? parent?.notifyListeners() : notifyListeners();
   }
   }
 
 
   Node? childAtIndex(int index) {
   Node? childAtIndex(int index) {

+ 1 - 1
frontend/app_flowy/packages/flowy_editor/lib/document/state_tree.dart

@@ -51,7 +51,7 @@ class StateTree {
     if (updatedNode == null) {
     if (updatedNode == null) {
       return null;
       return null;
     }
     }
-    final previousAttributes = {...updatedNode.attributes};
+    final previousAttributes = Attributes.from(updatedNode.attributes);
     updatedNode.updateAttributes(attributes);
     updatedNode.updateAttributes(attributes);
     return previousAttributes;
     return previousAttributes;
   }
   }

+ 1 - 1
frontend/app_flowy/packages/flowy_editor/lib/editor_state.dart

@@ -39,7 +39,7 @@ class EditorState {
   void update(Node node, Attributes attributes) {
   void update(Node node, Attributes attributes) {
     _applyOperation(UpdateOperation(
     _applyOperation(UpdateOperation(
       path: node.path,
       path: node.path,
-      attributes: Attributes.from(attributes)..addAll(attributes),
+      attributes: Attributes.from(node.attributes)..addAll(attributes),
       oldAttributes: node.attributes,
       oldAttributes: node.attributes,
     ));
     ));
   }
   }