React Native apps will fail in Android if you use the react-native-maps
module improperly.
The problem is documented:
Components that aren’t declared by this library (Ex: Markers, Polyline) must not be children of the MapView component due to MapView’s unique rendering methodology. Have your custom components / views outside the MapView component and position absolute to ensure they only re-render as needed. Example:
Bad:
<View style={StyleSheet.absoluteFillObject}>
<MapView style={StyleSheet.absoluteFillObject}>
<View style={{ position: 'absolute', top: 100, left: 50 }}/>
</MapView>
</View>
Good:
<View style={StyleSheet.absoluteFillObject}>
<MapView style={StyleSheet.absoluteFillObject}/>
<View style={{ position: 'absolute', top: 100, left: 50 }}/>
</View>
When you do things the wrong way, you’ll get a RedBox
error. The error can have different formats depending on what your code looks like. It might say
index=4 count=3
addInArray
ViewGroup.java
addViewInner
ViewGroup.java
addView
ViewGroup.java
addFeature
AirMapView.java
manageChildren
NativeViewHierarchyManager
...
The initial error message may also say “The specified child already has a parent. You must call removeView() on the child’s parent first”. The stack trace will be similar, but not identical.
The documentation explains how to fix this problem: simply move the improper components outside of MapView
.
I’ve got a working React Native app checked into github that demos the issue and the fix. There’s also a YouTube video.
I hope this blog post helps you fix your React Native bug!