android - Flutter:尝试在 Android 上使用 map_view 显示交互式 map 时应用程序崩溃

标签 android flutter dart

我正在尝试在用户使用 map_view 插件点击地址时显示交互式 map 。我遇到的问题是每次我点击地址时,应用程序都会崩溃。

这是我的项目结构/配置(详细信息):

lib\main.dart

import 'package:flutter/material.dart';

import 'package:map_view/map_view.dart';

import './pages/product.dart';

void main() {
  MapView.setApiKey(<my_google_developer_api_key>);
  runApp(MyApp());
}

lib\pages\product.dart

import 'package:flutter/material.dart';

import 'package:map_view/map_view.dart';

class ProductPage extends StatelessWidget {
  void _showMap() {
    final List<Marker> markers = <Marker>[
      Marker('position', 'Position', product.location.latitude,
          product.location.longitude)
    ];
    final cameraPosition = CameraPosition(
        Location(product.location.latitude, product.location.longitude), 14.0);
    final mapView = MapView();
    mapView.show(
        MapOptions(
            initialCameraPosition: cameraPosition,
            mapViewType: MapViewType.normal,
            title: 'Product Location'),
        toolbarActions: [
          ToolbarAction('Close', 1),
        ]);
    mapView.onToolbarAction.listen((int id) {
      if (id == 1) {
        mapView.dismiss();
      }
    });
    mapView.onMapReady.listen((_) {
      mapView.setMarkers(markers);
    });
  }
}

pubspec.yaml

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  scoped_model: ^1.0.1
  http: ^0.12.0+2
  shared_preferences: ^0.5.3+4
  rxdart: ^0.22.1+1
  map_view: ^0.0.14
  location: ^1.4.1

android\build.gradle

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0'
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.50'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}
subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex')) {
                details.useVersion '27.1.1'
            }
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

android\app\src\main\AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.easy_list">

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->
    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="easy_list"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- This keeps the window background of the activity showing
                 until Flutter renders its first frame. It can be removed if
                 there is no splash screen (such as the default splash screen
                 defined in @style/LaunchTheme). -->
            <meta-data
                android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                android:value="true" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name="com.apptreesoftware.mapview.MapActivity" android:theme="@style/Theme.AppCompat.Light.DarkActionBar"/>
        <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value=<my-google-developer-api-key>/>
        <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
        <meta-data android:name="com.google.android.geo.API_KEY" android:value=<my-google-developer-api-key>/>
    </application>
</manifest>

控制台显示的错误信息

I/flutter ( 5555): {showUserLocation: false, showMyLocationButton: false, showCompassButton:
false, hideToolbar: false, cameraPosition: {latitude: 21.0277644, longitude: 105.8341598, tim
e: 0, altitude: 0.0, speed: 0.0, bearing: 0.0, horizontalAccuracy: 0.0, verticalAccuracy: 0.0
, zoom: 14.0, tilt: 0.0}, title: Product Location, mapViewType: normal}
W/art     ( 5555): Before Android 4.1, method android.graphics.PorterDuffColorFilter android.
support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffCo
lorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have i
ncorrectly overridden the package-private method in android.graphics.drawable.Drawable
I/zzbz    ( 5555): Making Creator dynamically
I/art     ( 5555): Enter while loop.
I/DynamiteModule( 5555): Considering local module com.google.android.gms.maps_dynamite:0 and
remote module com.google.android.gms.maps_dynamite:221
I/DynamiteModule( 5555): Selected remote version of com.google.android.gms.maps_dynamite, ver
sion >= 221
W/System  ( 5555): ClassLoader referenced unknown path:
W/System  ( 5555): ClassLoader referenced unknown path: /data/user_de/0/com.google.android.gm
s/app_chimera/m/00000071/n/armeabi-v7a
W/System  ( 5555): ClassLoader referenced unknown path: /data/user_de/0/com.google.android.gm
s/app_chimera/m/00000071/n/armeabi
I/Google Maps Android API( 5555): Google Play services client version: 12451000
I/Google Maps Android API( 5555): Google Play services package version: 18382017
D/AndroidRuntime( 5555): Shutting down VM
E/AndroidRuntime( 5555): FATAL EXCEPTION: main
E/AndroidRuntime( 5555): Process: com.example.easy_list, PID: 5555
E/AndroidRuntime( 5555): java.lang.RuntimeException: Unable to start activity ComponentInfo{c
om.example.easy_list/com.apptreesoftware.mapview.MapActivity}: android.view.InflateException:
 Binary XML file line #2: Binary XML file line #2: Error inflating class fragment
E/AndroidRuntime( 5555):        at android.app.ActivityThread.performLaunchActivity(ActivityT
hread.java:2724)
E/AndroidRuntime( 5555):        at android.app.ActivityThread.handleLaunchActivity(ActivityTh
read.java:2789)
E/AndroidRuntime( 5555):        at android.app.ActivityThread.-wrap12(ActivityThread.java)
E/AndroidRuntime( 5555):        at android.app.ActivityThread$H.handleMessage(ActivityThread.
java:1527)
E/AndroidRuntime( 5555):        at android.os.Handler.dispatchMessage(Handler.java:110)
E/AndroidRuntime( 5555):        at android.os.Looper.loop(Looper.java:203)
E/AndroidRuntime( 5555):        at android.app.ActivityThread.main(ActivityThread.java:6251)
E/AndroidRuntime( 5555):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 5555):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:1063)
E/AndroidRuntime( 5555):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:92
4)
E/AndroidRuntime( 5555): Caused by: android.view.InflateException: Binary XML file line #2: B
inary XML file line #2: Error inflating class fragment
E/AndroidRuntime( 5555): Caused by: android.view.InflateException: Binary XML file line #2: E
rror inflating class fragment
E/AndroidRuntime( 5555): Caused by: java.lang.RuntimeException: The API key can only be speci
fied once. It is recommended that you use the meta-data tag with the name: com.google.android
.geo.API_KEY in the <application> element of AndroidManifest.xml
E/AndroidRuntime( 5555):        at com.google.maps.api.android.lib6.drd.r.b(:com.google.andro
id.gms.dynamite_mapsdynamite@18382046@18.3.82 (040306-260264002):23)
E/AndroidRuntime( 5555):        at com.google.maps.api.android.lib6.auth.f.a(:com.google.andr
oid.gms.dynamite_mapsdynamite@18382046@18.3.82 (040306-260264002):10)
E/AndroidRuntime( 5555):        at com.google.maps.api.android.lib6.impl.f.a(:com.google.andr
oid.gms.dynamite_mapsdynamite@18382046@18.3.82 (040306-260264002):41)
E/AndroidRuntime( 5555):        at com.google.android.gms.maps.internal.CreatorImpl.a(:com.go
ogle.android.gms.dynamite_mapsdynamite@18382046@18.3.82 (040306-260264002):61)
E/AndroidRuntime( 5555):        at com.google.android.gms.maps.internal.CreatorImpl.newMapFra
gmentDelegate(:com.google.android.gms.dynamite_mapsdynamite@18382046@18.3.82 (040306-26026400
2):25)
E/AndroidRuntime( 5555):        at com.google.android.gms.maps.internal.j.a(:com.google.andro
id.gms.dynamite_mapsdynamite@18382046@18.3.82 (040306-260264002):73)
E/AndroidRuntime( 5555):        at hs.onTransact(:com.google.android.gms.dynamite_mapsdynamit
e@18382046@18.3.82 (040306-260264002):4)
E/AndroidRuntime( 5555):        at android.os.Binder.transact(Binder.java:504)
E/AndroidRuntime( 5555):        at com.google.android.gms.internal.maps.zza.transactAndReadEx
ception(Unknown Source)
E/AndroidRuntime( 5555):        at com.google.android.gms.maps.internal.zzf.zzc(Unknown Sourc
e)
E/AndroidRuntime( 5555):        at com.google.android.gms.maps.SupportMapFragment$zzb.zzc(Unk
nown Source)
E/AndroidRuntime( 5555):        at com.google.android.gms.maps.SupportMapFragment$zzb.createD
elegate(Unknown Source)
E/AndroidRuntime( 5555):        at com.google.android.gms.dynamic.DeferredLifecycleHelper.zza
(Unknown Source)
E/AndroidRuntime( 5555):        at com.google.android.gms.dynamic.DeferredLifecycleHelper.onI
nflate(Unknown Source)
E/AndroidRuntime( 5555):        at com.google.android.gms.maps.SupportMapFragment.onInflate(U
nknown Source)
E/AndroidRuntime( 5555):        at android.support.v4.app.Fragment.onInflate(Fragment.java:13
02)
E/AndroidRuntime( 5555):        at android.support.v4.app.FragmentManagerImpl.onCreateView(Fr
agmentManager.java:3714)
E/AndroidRuntime( 5555):        at android.support.v4.app.FragmentController.onCreateView(Fra
gmentController.java:114)
E/AndroidRuntime( 5555):        at android.support.v4.app.FragmentActivity.dispatchFragmentsO
nCreateView(FragmentActivity.java:374)
E/AndroidRuntime( 5555):        at android.support.v4.app.BaseFragmentActivityApi14.onCreateV
iew(BaseFragmentActivityApi14.java:39)
E/AndroidRuntime( 5555):        at android.support.v4.app.FragmentActivity.onCreateView(Fragm
entActivity.java:68)
E/AndroidRuntime( 5555):        at android.view.LayoutInflater.createViewFromTag(LayoutInflat
er.java:777)
E/AndroidRuntime( 5555):        at android.view.LayoutInflater.createViewFromTag(LayoutInflat
er.java:727)
E/AndroidRuntime( 5555):        at android.view.LayoutInflater.inflate(LayoutInflater.java:49
5)
E/AndroidRuntime( 5555):        at android.view.LayoutInflater.inflate(LayoutInflater.java:42
6)
E/AndroidRuntime( 5555):        at android.view.LayoutInflater.inflate(LayoutInflater.java:37
7)
E/AndroidRuntime( 5555):        at android.support.v7.app.AppCompatDelegateImplV9.setContentV
iew(AppCompatDelegateImplV9.java:287)
E/AndroidRuntime( 5555):        at android.support.v7.app.AppCompatActivity.setContentView(Ap
pCompatActivity.java:139)
E/AndroidRuntime( 5555):        at com.apptreesoftware.mapview.MapActivity.onCreate(MapActivi
ty.kt:31)
E/AndroidRuntime( 5555):        at android.app.Activity.performCreate(Activity.java:6666)
E/AndroidRuntime( 5555):        at android.app.Instrumentation.callActivityOnCreate(Instrumen
tation.java:1118)
E/AndroidRuntime( 5555):        at android.app.ActivityThread.performLaunchActivity(ActivityT
hread.java:2677)
E/AndroidRuntime( 5555):        at android.app.ActivityThread.handleLaunchActivity(ActivityTh
read.java:2789)
E/AndroidRuntime( 5555):        at android.app.ActivityThread.-wrap12(ActivityThread.java)
E/AndroidRuntime( 5555):        at android.app.ActivityThread$H.handleMessage(ActivityThread.
java:1527)
E/AndroidRuntime( 5555):        at android.os.Handler.dispatchMessage(Handler.java:110)
E/AndroidRuntime( 5555):        at android.os.Looper.loop(Looper.java:203)
E/AndroidRuntime( 5555):        at android.app.ActivityThread.main(ActivityThread.java:6251)
E/AndroidRuntime( 5555):        at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 5555):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
(ZygoteInit.java:1063)
E/AndroidRuntime( 5555):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:92
4)
Lost connection to device.

我希望交互式 map 显示在屏幕上,但应用却崩溃了。任何帮助表示赞赏。提前致谢。

最佳答案

你案例的主要问题是:

E/AndroidRuntime( 5555): Caused by: java.lang.RuntimeException: The API key can only be speci
fied once. It is recommended that you use the meta-data tag with the name: com.google.android
.geo.API_KEY in the <application> element of AndroidManifest.xml

尝试删除这一行:

    <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value=<my-google-developer-api-key>/>

然后再次运行....

关于android - Flutter:尝试在 Android 上使用 map_view 显示交互式 map 时应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57487142/

相关文章:

java - 首次启动时,将 Activity 设置为默认 Activity

flutter - 动画小部件仅动画一次

flutter - 在 FAB 上添加表格小部件单击 FLUTTER

flutter - IndexedStack小部件未更新

flutter - 如何从flutter中的不同包读取 Assets JSON文件?

android - 如何在 Android TV 上使用NotificationContentProvider 获取通知计数?

java - 用于 Wifi 状态的 Android Monkeyrunner 插件

android - 错误 :(10) Error parsing XML: duplicate attribute

android - 我如何在 main dart 中运行图表? - flutter

dart - Flutter:RenderBox 没有布局