android 谷歌Map显示与空的位置,即使有效的API键在Flutter时,应用程序启动,并正常工作时,我做多个热重载

stszievb  于 2023-09-29  发布在  Android
关注(0)|答案(2)|浏览(125)

我正试图在我的flutter应用程序嵌入本地android谷歌Map视图。我知道我们已经在pub.dev上有了google_map_plugin,但为了提高我作为开发人员的水平,我正试图在我的flutter应用程序中集成原生Android代码。
这是我的dart代码

const myGoogleMapView = 'myGoogleMapView';

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

  @override
  Widget build(BuildContext context) {
    return Platform.isAndroid
        ? const AndroidView(
            viewType: myGoogleMapView,
            layoutDirection: TextDirection.ltr,
            creationParams: null,
            creationParamsCodec: StandardMessageCodec(),
          )
        : const UiKitView(
            viewType: myGoogleMapView,
            layoutDirection: TextDirection.ltr,
            creationParams: null,
            creationParamsCodec: StandardMessageCodec(),
          );

   
  }
}

接下来在android端我添加了我的apikey在manifest和互联网权限以及
单位:MainActivity.kt

class MainActivity: FlutterActivity() {

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
    super.configureFlutterEngine(flutterEngine)

    flutterEngine
        .platformViewsController
        .registry
        .registerViewFactory("myGoogleMapView", MyGoogleMapViewFactory(this))

}
}

然后我创建了MyGoogleMapViewFactoryMyGoogleMapView

class MyGoogleMapViewFactory(private val activity: FlutterActivity) : PlatformViewFactory(StandardMessageCodec.INSTANCE) {
    override fun create(context: Context, viewId: Int, args: Any?): PlatformView {
        val creationParams = args as Map<String?, Any?>?
        return MyGoogleMapView(context, viewId, creationParams,activity)

    }
}

class MyGoogleMapView(context: Context, id: Int, creationParams: Map<String?, Any?>?,activity: FlutterActivity) :
    PlatformView, OnMapReadyCallback {
    private val mapview: MapView = MapView(context)
    private var loadedCallbackPending = false
    private var mMap: GoogleMap? = null
    private var currentMarker: Marker? = null

    override fun getView(): View {
        return mapview
    }

    override fun dispose() {}

    init {
        val layoutParams: ViewGroup.LayoutParams = ViewGroup.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT
        )
        mapview.layoutParams = layoutParams

        mapview.onCreate(null)
        mapview.getMapAsync(this)

    }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
        val myLocation = LatLng(37.7749, -122.4194)
        if (currentMarker != null) {
            currentMarker?.remove()
        }
        currentMarker = mMap?.addMarker(
            MarkerOptions().position(myLocation).title("Marker Title")
        )
        mMap?.moveCamera(CameraUpdateFactory.newLatLngZoom(myLocation, 10f))

    }

    private fun invalidateMapIfNeeded() {
        if (mMap == null || loadedCallbackPending) {
            return
        }
        loadedCallbackPending = true
        mMap!!.setOnMapLoadedCallback {
            loadedCallbackPending = false
            postFrameCallback {
                postFrameCallback {
                    mapview.invalidate()
                }
            }
        }
    }

    private fun postFrameCallback(f: Runnable) {
        Choreographer.getInstance().postFrameCallback { f.run() }
    }

}

我只看到一个空的谷歌Map,上面有我的标记。我100%确定我的apikey是正确的,因为我在我的原生android应用程序中使用的是具有相同包名称的相同apikey,它工作正常。
我还检查了谷歌Map插件的github代码,他们写了invalidateMapIfNeeded,我复制粘贴,并试图在不同的地方调用它,如initonMapReady等,但不为我工作
我也试着在 dart 的侧面使用Hybrid构图

return PlatformViewLink(
      viewType: myGoogleMapView,
      surfaceFactory: (context, controller) {
        return AndroidViewSurface(
          controller: controller as AndroidViewController,
          gestureRecognizers: const <Factory<OneSequenceGestureRecognizer>>{},
          hitTestBehavior: PlatformViewHitTestBehavior.opaque,
        );
      },
      onCreatePlatformView: (params) {
        return PlatformViewsService.initSurfaceAndroidView(
          id: params.id,
          viewType: myGoogleMapView,
          layoutDirection: TextDirection.ltr,
          creationParams: null,
          creationParamsCodec: const StandardMessageCodec(),
          onFocus: () {
            params.onFocusChanged(true);
          },
        )
          ..addOnPlatformViewCreatedListener(params.onPlatformViewCreated)
          ..create();
      },
    );

但这也不起作用。当我尝试使用简单的视图,如TextViewEditText从原生android端,然后它的工作正常。不确定谷歌Map有什么问题
请注意here,因为我超出了文本限制
输出

我注意到的另一件事是,当我第一次运行应用程序时,GoogleMap是空的,就像我上面显示的那样,但是如果我继续多次热重载,Map开始慢慢显示。查看video了解更多信息

hgqdbh6s

hgqdbh6s1#

这个错误似乎与谷歌MapAPI从谷歌控制台和授权。你是否将SHa-1放入并限制了API?我记得有一次遇到过这种错误。

7gyucuyw

7gyucuyw2#

多种因素的存在造成了这一现象,因此调试它可能需要进行一些调查。以下是您可以采取的诊断和解决问题的一些步骤:

**网络连接:**确保您的设备或模拟器在运行应用时具有活动的网络连接。谷歌Map需要互联网连接才能加载Map。
**提示:**确认您在代码中正确初始化了Google Maps组件。如果您在Flutter中使用GoogleMap小部件,则通常应该在onMapCreated回调中执行此操作。
**错误处理:**实现Google Maps初始化的错误处理。检查Map初始化期间抛出的任何错误消息或异常,并将其显示在应用的UI中或记录它们以用于调试目的。
**日志和调试:**使用开发人员工具和日志收集有关可能导致问题的详细信息。在日志中查找与Google Maps组件相关的任何错误消息或警告。
**状态管理:**确保Flutter应用中的状态管理设置正确。在某些情况下,热重新加载可以通过重新初始化状态来帮助“修复”问题。
**依赖项:**检查项目的依赖项并确保它们是最新的,特别是与Map或位置服务相关的任何包。
**重建过程:**了解Flutter中热重装和重建的工作方式。多次重建应用程序可能会以某种方式触发Map的正确初始化过程。
**插件兼容性:**确保您用于GoogleMap的Flutter插件与您的Flutter版本兼容。有时,兼容性问题可能会导致意外行为。
**缓存:**检查多次热加载后,是否有可能导致Map显示的Map数据缓存或初始化。
**在不同设备上测试:**尝试在不同设备或模拟器上运行您的应用,以查看问题是否特定于特定环境。

相关问题