Update screen-layout props during diffing

Summary: This diff optimizes the delivery of onLayout event and re-lauout of views when ReactShadow nodes are updated. This only affects Fabric rendering.

Reviewed By: shergin

Differential Revision: D8601659

fbshipit-source-id: 3e33521e53170320ea952003fada5297a7605934
This commit is contained in:
David Vacca 2018-06-23 13:28:33 -07:00 committed by Facebook Github Bot
parent 6942408a47
commit 0b2cee59d2
3 changed files with 23 additions and 10 deletions

View File

@ -73,7 +73,7 @@ public class FabricReconciler {
if (prevNode.getReactTag() != newNode.getReactTag()) {
break;
}
enqueueUpdateProperties(newNode);
enqueueUpdateProperties(newNode, prevNode);
manageChildren(prevNode, prevNode.getChildrenList(), newNode.getChildrenList());
newNode.setOriginalReactShadowNode(null);
}
@ -88,7 +88,7 @@ public class FabricReconciler {
for (int k = firstRemovedOrAddedViewIndex; k < newList.size(); k++) {
ReactShadowNode newNode = newList.get(k);
if (newNode.isVirtual()) continue;
enqueueUpdateProperties(newNode);
enqueueUpdateProperties(newNode, null);
viewsToAdd.add(new ViewAtIndex(newNode.getReactTag(), k));
List previousChildrenList = newNode.getOriginalReactShadowNode() == null ? null : newNode.getOriginalReactShadowNode().getChildrenList();
manageChildren(newNode, previousChildrenList, newNode.getChildrenList());
@ -131,24 +131,28 @@ public class FabricReconciler {
}
}
private void enqueueUpdateProperties(ReactShadowNode node) {
int reactTag = node.getReactTag();
private void enqueueUpdateProperties(ReactShadowNode newNode, ReactShadowNode prevNode) {
int reactTag = newNode.getReactTag();
if (DEBUG) {
FLog.d(
TAG,
"manageChildren.enqueueUpdateProperties " +
"\n\ttag: " + reactTag +
"\n\tviewClass: " + node.getViewClass() +
"\n\tinstanceHandle: " + node.getInstanceHandle() +
"\n\tnewProps: " + node.getNewProps());
"\n\tviewClass: " + newNode.getViewClass() +
"\n\tinstanceHandle: " + newNode.getInstanceHandle() +
"\n\tnewProps: " + newNode.getNewProps());
}
if (node.getNewProps() != null) {
if (prevNode != null) {
newNode.updateScreenLayout(prevNode);
}
if (newNode.getNewProps() != null) {
uiViewOperationQueue.enqueueUpdateProperties(
reactTag, node.getViewClass(), node.getNewProps());
reactTag, newNode.getViewClass(), newNode.getNewProps());
}
uiViewOperationQueue.enqueueUpdateInstanceHandle(
reactTag, node.getInstanceHandle());
reactTag, newNode.getInstanceHandle());
}
}

View File

@ -389,4 +389,5 @@ public interface ReactShadowNode<T extends ReactShadowNode> {
*/
boolean isSealed();
void updateScreenLayout(ReactShadowNode prevNode);
}

View File

@ -1220,4 +1220,12 @@ public class ReactShadowNodeImpl implements ReactShadowNode<ReactShadowNodeImpl>
throw new IllegalStateException("Can not modify sealed node " + toString());
}
}
public void updateScreenLayout(ReactShadowNode prevNode) {
assertNotSealed();
mScreenHeight = prevNode.getScreenHeight();
mScreenWidth = prevNode.getScreenWidth();
mScreenX = prevNode.getScreenX();
mScreenY = prevNode.getScreenY();
}
}