尝试在 Kotlin 中创建 mapView 反应原生 UI 组件时,我不断收到“kotlin.UninitializedPropertyAccessException”

问题描述 投票:0回答:1

我正在尝试在 Android 端使用 Kotlin 创建一个 React-Native UI 组件。我使用 Bob“https://github.com/callstack/react-native-builder-bob”设置了项目,然后自定义了 ViewManager、Package,并创建了一个 View。

该组件正在使用 ArcGIS SDK for Kotlin,尝试设置一个 MapView,理想情况下将其用作我的反应原生应用程序中的 UI 组件。 “https://developers.arcgis.com/kotlin/api-reference/arcgis-maps-kotlin/com.arcgismaps.mapping.view/-map-view/index.html”

我使用了一些在网上找到的示例来帮助构建这个,但它们有点过时了。当我尝试构建时出现问题,它会抛出下面描述的错误。

这是代码:

显示地图鲍勃视图:

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() {
  }
}

显示地图鲍勃视图管理器:

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)
}

显示地图鲍勃包:

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>

设置初始项目并运行它后,我看到默认创建的虚拟组件,但是在我为我的地图视图组件添加代码后,它无法构建并出现以下错误。我不太确定从这里该去哪里,我已经搞乱了初始化生命周期,但说实话,我对 Android 开发和 Kotlin 很陌生,所以这被证明是徒劳的。

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)
react-native kotlin arcgis react-native-ui-components
1个回答
0
投票

将主 Activity 转为单例,并在

setUpMap()
方法中将地图视图注册为生命周期观察者:

MainActivity.getInstance().lifecycle.addObserver(mapView)

请参阅此答案了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.