I am trying to create a react-native UI component, using Kotlin on the Android side. I set up the project using Bob, "https://github.com/callstack/react-native-builder-bob", then customized the ViewManager, Package, and created a View.
The component is using the ArcGIS SDK for Kotlin, trying to set up a MapView that would ideally be used as the UI component in my react-native app. "https://developers.arcgis.com/kotlin/api-reference/arcgis-maps-kotlin/com.arcgismaps.mapping.view/-map-view/index.html"
I used some examples I found online to help build this, but they are a little outdated. The problem comes when I try to build, it throws the error described below.
Here is the code:
DisplayMapBobView:
package com.displaymapbob
import android.content.Context
import android.view.View
import android.widget.LinearLayout
import com.arcgismaps.mapping.ArcGISMap
import com.arcgismaps.mapping.view.MapView
import com.arcgismaps.mapping.BasemapStyle
import com.arcgismaps.mapping.Viewpoint
import com.arcgismaps.ApiKey
import com.arcgismaps.ArcGISEnvironment
import com.facebook.react.bridge.LifecycleEventListener
import com.facebook.react.bridge.ReactContext
class DisplayMapBobView(context: Context) : LinearLayout(context), LifecycleEventListener {
var mapView: MapView
init {
var rootView: View = inflate(context.applicationContext, R.layout.display_map_bob_view, this)
mapView = rootView.findViewById(R.id.agsMapView)
if (context is ReactContext) {
context.addLifecycleEventListener(this)
}
setApiKey()
setUpMap()
}
fun setUpMap() {
val map = ArcGISMap(BasemapStyle.ArcGISTopographic)
// set the map to be displayed in the layout's MapView
mapView.map = map
mapView.setViewpoint(Viewpoint(34.0270, -118.8050, 72000.0))
}
fun setApiKey() {
// It is not best practice to store API keys in source code. We have you insert one here
// to streamline this tutorial.
ArcGISEnvironment.apiKey = ApiKey.create("HIDDEN")
}
override fun onHostResume() {
}
override fun onHostPause() {
}
override fun onHostDestroy() {
}
}
DisplayMapBobViewManager:
package com.displaymapbob
import android.graphics.Color
import android.view.View
import com.arcgismaps.ApiKey
import com.arcgismaps.ArcGISEnvironment
import com.arcgismaps.mapping.view.MapView
import com.facebook.react.uimanager.SimpleViewManager
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.uimanager.annotations.ReactProp
class DisplayMapBobViewManager : SimpleViewManager<DisplayMapBobView>() {
override fun getName() = "DisplayMapBobView"
override fun createViewInstance(reactContext: ThemedReactContext) =
DisplayMapBobView(reactContext)
}
DisplayMapBobPackage:
package com.displaymapbob
import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager
class DisplayMapBobPackage : ReactPackage {
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
return emptyList()
}
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
return listOf(DisplayMapBobViewManager())
}
}
display_map_bob_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.arcgismaps.mapping.view.MapView
android:id="@+id/agsMapView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
After setting up the initial project and running it, I saw the dummy component that was created by default, but after I added code for my mapview component, it fails to build giving the below error. I am not exactly sure where to go from here, I have messed around with initializing a lifecycle but to be honest, I am new to Android development and Kotlin, so this was proving futile.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.displaymapbobexample, PID: 12413
kotlin.UninitializedPropertyAccessException: lateinit property lifeCycleOwner has not been initialized
at com.arcgismaps.mapping.view.GeoView.getLifeCycleOwner$api_release(GeoView.kt:100)
at com.arcgismaps.mapping.view.GeoView$RenderingThread.onSurfaceTextureAvailable(GeoView.kt:1315)
at android.view.TextureView.getTextureLayer(TextureView.java:390)
at android.view.TextureView.draw(TextureView.java:339)
at android.view.View.updateDisplayListIfDirty(View.java:19082)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.draw(View.java:20210)
at android.view.View.updateDisplayListIfDirty(View.java:19082)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:836)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:809)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:836)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:809)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at com.facebook.react.views.view.ReactViewGroup.drawChild(ReactViewGroup.java:836)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at com.facebook.react.views.view.ReactViewGroup.dispatchDraw(ReactViewGroup.java:809)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at com.facebook.react.ReactRootView.dispatchDraw(ReactRootView.java:297)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.updateDisplayListIfDirty(View.java:19073)
at android.view.View.draw(View.java:19935)
at android.view.ViewGroup.drawChild(ViewGroup.java:4333)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4112)
at android.view.View.draw(View.java:20210)
at com.android.internal.policy.DecorView.draw(DecorView.java:780)
at android.view.View.updateDisplayListIfDirty(View.java:19082)
E/AndroidRuntime: at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:686)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:692)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:801)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3311)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:3115)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2484)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
at android.view.Choreographer.doCallbacks(Choreographer.java:761)
at android.view.Choreographer.doFrame(Choreographer.java:696)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)