fix: rebuilding node widgets when the subtype changes

This commit is contained in:
Lucas.Xu 2022-07-16 20:08:41 +08:00
parent 6eb347a096
commit 1039c5517f
3 changed files with 11 additions and 6 deletions

View File

@ -13,8 +13,9 @@ class Node extends ChangeNotifier with LinkedListEntry<Node> {
String? get subtype {
// TODO: make 'subtype' as a const value.
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;
}
@ -63,12 +64,16 @@ class Node extends ChangeNotifier with LinkedListEntry<Node> {
}
void updateAttributes(Attributes attributes) {
bool shouldNotifyParent =
this.attributes['subtype'] != attributes['subtype'];
for (final attribute in attributes.entries) {
this.attributes[attribute.key] = attribute.value;
}
// 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) {

View File

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

View File

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