我正试图在我的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))
}
}
然后我创建了MyGoogleMapViewFactory
和MyGoogleMapView
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
,我复制粘贴,并试图在不同的地方调用它,如init
,onMapReady
等,但不为我工作
我也试着在 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();
},
);
但这也不起作用。当我尝试使用简单的视图,如TextView
或EditText
从原生android端,然后它的工作正常。不确定谷歌Map有什么问题
请注意here,因为我超出了文本限制
输出
我注意到的另一件事是,当我第一次运行应用程序时,GoogleMap是空的,就像我上面显示的那样,但是如果我继续多次热重载,Map开始慢慢显示。查看video了解更多信息
2条答案
按热度按时间hgqdbh6s1#
这个错误似乎与谷歌MapAPI从谷歌控制台和授权。你是否将SHa-1放入并限制了API?我记得有一次遇到过这种错误。
7gyucuyw2#
多种因素的存在造成了这一现象,因此调试它可能需要进行一些调查。以下是您可以采取的诊断和解决问题的一些步骤:
**网络连接:**确保您的设备或模拟器在运行应用时具有活动的网络连接。谷歌Map需要互联网连接才能加载Map。
**提示:**确认您在代码中正确初始化了Google Maps组件。如果您在Flutter中使用GoogleMap小部件,则通常应该在onMapCreated回调中执行此操作。
**错误处理:**实现Google Maps初始化的错误处理。检查Map初始化期间抛出的任何错误消息或异常,并将其显示在应用的UI中或记录它们以用于调试目的。
**日志和调试:**使用开发人员工具和日志收集有关可能导致问题的详细信息。在日志中查找与Google Maps组件相关的任何错误消息或警告。
**状态管理:**确保Flutter应用中的状态管理设置正确。在某些情况下,热重新加载可以通过重新初始化状态来帮助“修复”问题。
**依赖项:**检查项目的依赖项并确保它们是最新的,特别是与Map或位置服务相关的任何包。
**重建过程:**了解Flutter中热重装和重建的工作方式。多次重建应用程序可能会以某种方式触发Map的正确初始化过程。
**插件兼容性:**确保您用于GoogleMap的Flutter插件与您的Flutter版本兼容。有时,兼容性问题可能会导致意外行为。
**缓存:**检查多次热加载后,是否有可能导致Map显示的Map数据缓存或初始化。
**在不同设备上测试:**尝试在不同设备或模拟器上运行您的应用,以查看问题是否特定于特定环境。