Skip to content

Commit 0b6cd69

Browse files
mdvaccaalloy
authored andcommittedMar 5, 2020
Return null when requesting constants for nonexistent View Managers in RN Android
Summary: This diff changes the behavior of UIImplementation.resolveViewManager() to return null instead of throwing an exception when trying to find an unexistent viewManager during the computation of constants for view Managers. The C++/JS code manages exceptions and null results when a view manager doesn't exists, this diff simplifies the way this method operates. changeLog: [internal] Reviewed By: rickhanlonii Differential Revision: D19624423 fbshipit-source-id: df31dcfae9a588bf325b61d529cec6ead59fb19d
1 parent d22cc4f commit 0b6cd69

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed
 

‎ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,8 @@ public final ReactShadowNode resolveShadowNode(int reactTag) {
128128
return mShadowNodeRegistry.getNode(reactTag);
129129
}
130130

131-
protected final ViewManager resolveViewManager(String className) {
132-
return mViewManagers.get(className);
131+
protected final @Nullable ViewManager resolveViewManager(String className) {
132+
return mViewManagers.getViewManagerIfExists(className);
133133
}
134134

135135
/*package*/ UIViewOperationQueue getUIViewOperationQueue() {

‎ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java

+35-5
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,49 @@ public ViewManagerRegistry(Map<String, ViewManager> viewManagerMap) {
4242
mViewManagerResolver = null;
4343
}
4444

45+
/**
46+
* @param className {@link String} that identifies the {@link ViewManager} inside the {@link
47+
* ViewManagerRegistry}. This methods {@throws IllegalViewOperationException} if there is no
48+
* view manager registered for the className received as a parameter.
49+
* @return the {@link ViewManager} registered to the className received as a parameter
50+
*/
4551
public ViewManager get(String className) {
4652
ViewManager viewManager = mViewManagers.get(className);
4753
if (viewManager != null) {
4854
return viewManager;
4955
}
5056
if (mViewManagerResolver != null) {
51-
viewManager = mViewManagerResolver.getViewManager(className);
52-
if (viewManager != null) {
53-
mViewManagers.put(className, viewManager);
54-
return viewManager;
55-
}
57+
viewManager = getViewManagerFromResolver(className);
58+
if (viewManager != null) return viewManager;
5659
throw new IllegalViewOperationException("ViewManagerResolver returned null for " + className);
5760
}
5861
throw new IllegalViewOperationException("No ViewManager found for class " + className);
5962
}
63+
64+
private @Nullable ViewManager getViewManagerFromResolver(String className) {
65+
@Nullable ViewManager viewManager;
66+
viewManager = mViewManagerResolver.getViewManager(className);
67+
if (viewManager != null) {
68+
mViewManagers.put(className, viewManager);
69+
}
70+
return viewManager;
71+
}
72+
73+
/**
74+
* @param className {@link String} that identifies the {@link ViewManager} inside the {@link
75+
* ViewManagerRegistry}.
76+
* @return the {@link ViewManager} registered to the className received as a parameter or null if
77+
* there is no ViewManager associated to the className received as a parameter.
78+
*/
79+
@Nullable
80+
ViewManager getViewManagerIfExists(String className) {
81+
ViewManager viewManager = mViewManagers.get(className);
82+
if (viewManager != null) {
83+
return viewManager;
84+
}
85+
if (mViewManagerResolver != null) {
86+
return getViewManagerFromResolver(className);
87+
}
88+
return null;
89+
}
6090
}

0 commit comments

Comments
 (0)
Please sign in to comment.