You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter集成ArcGIS MapView作为Platform View在Android端启动崩溃

Flutter集成ArcGIS Maps SDK for Kotlin v200.1 Platform View崩溃问题

我尝试在Flutter应用中集成ArcGIS Maps SDK for Kotlin v200.1的原生MapView作为Platform View,但在Android模拟器启动时应用崩溃抛出异常。使用旧版ArcGIS Runtime SDK for Android v100.15.2时则能正常启动并显示地图。以下是相关代码和崩溃信息:

Flutter端代码

lib/main.dart

// lib/main.dart
import 'package:flutter/material.dart';
import 'map_view.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('ArcGIS Map View'),
        ),
        body: const Center(
          child: MapView()
        ),
      ),
    );
  }
}

lib/map_view.dart

// lib/map_view.dart
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class MapView extends StatelessWidget {
  const MapView({super.key});

  @override
  Widget build(BuildContext context) {
    if (defaultTargetPlatform == TargetPlatform.iOS) {
      return const UiKitView(viewType: _viewType);
    } else if (defaultTargetPlatform == TargetPlatform.android) {
      return const AndroidView(viewType: _viewType);
    } else {
      throw UnsupportedError('Platform not supported');
    }
  }

  static const _viewType = 'mapView';
}

Android端v200.1实现代码

android/app/src/main/kotlin/com/example/test/NativeView.kt

// android/app/src/main/kotlin/com/example/test/NativeView.kt
package com.example.test

import android.content.Context
import android.view.View

import io.flutter.plugin.platform.PlatformView

import com.arcgismaps.ApiKey
import com.arcgismaps.ArcGISEnvironment
import com.arcgismaps.mapping.ArcGISMap
import com.arcgismaps.mapping.BasemapStyle
import com.arcgismaps.mapping.Viewpoint
import com.arcgismaps.mapping.view.MapView

internal class NativeView(context: Context, id: Int, creationParams: Map<String?, Any?>?) : PlatformView {
    private val mapView: MapView

    init {
        ArcGISEnvironment.apiKey = ApiKey.create("<hidden>")

        mapView = MapView(context)
        mapView.map = ArcGISMap(BasemapStyle.ArcGISTopographic)
        mapView.setViewpoint(Viewpoint(34.0270, -118.8050, 72000.0))
    }

    override fun getView(): View {
        return mapView
    }

    override fun dispose() {}
}

NativeView由NativeViewFactory实例化,符合Flutter官方文档实现方式。

崩溃日志

A Dart VM Service on sdk gphone64 x86 64 is available at: http://127.0.0.1:65061/zcoQFFeeeZk=/
The Flutter DevTools debugger and profiler on sdk gphone64 x86 64 is available at:
http://127.0.0.1:9102?uri=http://127.0.0.1:65061/zcoQFFeeeZk=/
I/PlatformViewsController(10555): Hosting view in view hierarchy for platform view: 0
I/Choreographer(10555): Skipped 62 frames!  The application may be doing too much work on its main thread.
E/FrameEvents(10555): updateAcquireFence: Did not find frame.
W/Parcel  (10555): Expecting binder but got null!
I/TextureView(10555): onSurfaceTextureAvailable
D/AndroidRuntime(10555): Shutting down VM
E/FrameEvents(10555): updateAcquireFence: Did not find frame.
E/AndroidRuntime(10555): FATAL EXCEPTION: main
E/AndroidRuntime(10555): Process: com.example.test, PID: 10555
E/AndroidRuntime(10555): kotlin.UninitializedPropertyAccessException: lateinit property lifeCycleOwner has not been initialized
E/AndroidRuntime(10555):        at com.arcgismaps.mapping.view.GeoView.getLifeCycleOwner$api_release(GeoView.kt:110)
E/AndroidRuntime(10555):        at com.arcgismaps.mapping.view.GeoView$RenderingThread.onSurfaceTextureAvailable(GeoView.kt:1630)
E/AndroidRuntime(10555):        at android.view.TextureView.getTextureLayer(TextureView.java:466)
E/AndroidRuntime(10555):        at android.view.TextureView.draw(TextureView.java:415)
E/AndroidRuntime(10555):        at android.view.View.updateDisplayListIfDirty(View.java:22061)
E/AndroidRuntime(10555):        at android.view.View.draw(View.java:22925)
E/AndroidRuntime(10555):        at android.view.ViewGroup.drawChild(ViewGroup.java:4529)
E/AndroidRuntime(10555):        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4290)
E/AndroidRuntime(10555):        at android.view.View.updateDisplayListIfDirty(View.java:22052)
E/AndroidRuntime(10555):        at android.view.View.draw(View.java:22925)
E/AndroidRuntime(10555):        at android.view.ViewGroup.drawChild(ViewGroup.java:4529)
E/AndroidRuntime(10555):        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4290)
E/AndroidRuntime(10555):        at android.view.View.draw(View.java:23197)
E/AndroidRuntime(10555):        at io.flutter.plugin.platform.PlatformViewWrapper.draw(PlatformViewWrapper.java:305)
E/AndroidRuntime(10555):        at android.view.View.updateDisplayListIfDirty(View.java:22061)
E/AndroidRuntime(10555):        at android.view.View.draw(View.java:22925)
E/AndroidRuntime(10555):        at android.view.ViewGroup.drawChild(ViewGroup.java:4529)
E/AndroidRuntime(10555):        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4290)
E/AndroidRuntime(10555):        at android.view.View.updateDisplayListIfDirty(View.java:22052)
E/AndroidRuntime(10555):        at android.view.View.draw(View.java:22925)
E/AndroidRuntime(10555):        at android.view.ViewGroup.drawChild(ViewGroup.java:4529)
E/AndroidRuntime(10555):        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4290)
E/AndroidRuntime(10555):        at android.view.View.updateDisplayListIfDirty(View.java:22052)
E/AndroidRuntime(10555):        at android.view.View.draw(View.java:22925)
E/AndroidRuntime(10555):        at android.view.ViewGroup.drawChild(ViewGroup.java:4529)
E/AndroidRuntime(10555):        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4290)
E/AndroidRuntime(10555):        at android.view.View.updateDisplayListIfDirty(View.java:22052)
E/AndroidRuntime(10555):        at android.view.View.draw(View.java:22925)
E/AndroidRuntime(10555):        at android.view.ViewGroup.drawChild(ViewGroup.java:4529)
E/AndroidRuntime(10555):        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:4290)
E/AndroidRuntime(10555):        at android.view.View.draw(View.java:23197)
E/AndroidRuntime(10555):        at com.android.internal.policy.DecorView.draw(DecorView.java:821)
E/AndroidRuntime(10555):        at android.view.View.updateDisplayListIfDirty(View.java:22061)
E/AndroidRuntime(10555):        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:689)
E/AndroidRuntime(10555):        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:695)
E/AndroidRuntime(10555):        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:793)
E/AndroidRuntime(10555):        at android.view.ViewRootImpl.draw(ViewRootImpl.java:4670)
E/AndroidRuntime(10555):        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4381)
E/AndroidRuntime(10555):        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3600)
E/AndroidRuntime(10555):        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2328)
E/AndroidRuntime(10555):        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9087)
E/AndroidRuntime(10555):        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
E/AndroidRuntime(10555):        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
E/AndroidRuntime(10555):        at android.view.Choreographer.doCallbacks(Choreographer.java:899)
E/AndroidRuntime(10555):        at android.view.Choreographer.doFrame(Choreographer.java:832)
E/AndroidRuntime(10555):        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
E/AndroidRuntime(10555):        at android.os.Handler.handleCallback(Handler.java:942)
E/AndroidRuntime(10555):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(10555):        at android.os.Looper.loopOnce(Looper.java:201)
E/AndroidRuntime(10555):        at android.os.Looper.loop(Looper.java:288)
E/AndroidRuntime(10555):        at android.app.ActivityThread.main(ActivityThread.java:7872)
E/AndroidRuntime(10555):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(10555):        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
E/AndroidRuntime(10555):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
D/TrafficStats(10555): tagSocket(123) with statsTag=0xffffffff, statsUid=-1
I/Process (10555): Sending signal. PID: 10555 SIG: 9
Lost connection to device.

旧版v100.15.2正常代码

android/app/src/main/kotlin/com/example/test/NativeView.kt

// android/app/src/main/kotlin/com/example/test/NativeView.kt
package com.example.test

import android.content.Context
import android.view.View

import io.flutter.plugin.platform.PlatformView

import com.esri.arcgisruntime.ArcGISRuntimeEnvironment
import com.esri.arcgisruntime.mapping.ArcGISMap
import com.esri.arcgisruntime.mapping.view.MapView
import com.esri.arcgisruntime.mapping.BasemapStyle
import com.esri.arcgisruntime.mapping.Viewpoint

internal class NativeView(context: Context, id: Int, creationParams: Map<String?, Any?>?) : PlatformView {
    private val mapView: MapView

    init {
        ArcGISRuntimeEnvironment.setApiKey("<hidden>")

        mapView = MapView(context)
        mapView.map = ArcGISMap(BasemapStyle.ARCGIS_TOPOGRAPHIC)
        mapView.setViewpoint(Viewpoint(34.0270, -118.8050, 72000.0))
    }

    override fun getView(): View {
        return mapView
    }

    override fun dispose() {}
}

环境信息

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.10.6, on macOS 13.4.1 22F770820d darwin-x64, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.1)
[✓] Xcode - develop for iOS and macOS (Xcode 14.3.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.3)
[✓] VS Code (version 1.80.1)
[✓] VS Code (version 1.81.0-insider)
[✓] Connected device (3 available)
[✓] Network resources

• No issues found!

注:有其他开发者在React Native中做相同操作时也遇到了相同的启动异常,但尚未得到解答。我并非资深Android开发者,请问v200.1版本的实现哪里出现了问题?

内容的提问来源于stack exchange,提问作者goofy4224

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:37:01