初めてグーグルマップがばたつく、ロードは完璧ですが、それをホットリスタートすると、プラットフォーム例外になります
google_maps_flutter:^ 0.5.21 + 15
Github [google_maps_flutter]作成済みのプラットフォームビューを作成しようとしています#45695
[ERROR:flutter/lib/ui/ui_Dart_state.cc(157)] Unhandled Exception: PlatformException(error, Java.lang.IllegalStateException: Trying to create an already created platform view, view id: 0
フラッタードクター-v
[✓] Flutter (Channel stable, v1.12.13+hotfix.5, on Linux, locale en_IN)
• Flutter version 1.12.13+hotfix.5 at /home/asus/Documents/Flutter_SDK/flutter
• Framework revision 27321ebbad (2 weeks ago), 2019-12-10 18:15:01 -0800
• Engine revision 2994f7e1e6
• Dart version 2.7.0
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
• Android SDK at /home/asus/Android/Sdk
• Android NDK location not configured (optional; useful for native profiling support)
• Platform Android-29, build-tools 29.0.2
• Java binary at: /snap/Android-studio/81/Android-studio/jre/bin/Java
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
• All Android licenses accepted.
[✓] Android Studio (version 3.5)
• Android Studio at /snap/Android-studio/81/Android-studio
• Flutter plugin version 42.1.1
• Dart plugin version 191.8593
• Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
[✓] Connected device (1 available)
• vivo 1723 • 49269ad3 • Android-arm64 • Android 9 (API 28)
• No issues found!
この問題を解決するために、ターミナルから次のことを行いました。
1-ブランチをマスターブランチに変更しました:
flutter channel master
2-アップグレードされたフラッター
flutter upgrade
3-コードをクリーンアップ:
Flutter clean
[〜#〜] api [〜#〜] によれば、
マップがレイアウトされるまで、このカメラアップデートでカメラを変更しないでください(このメソッドが適切な境界ボックスとズームレベルを正しく決定するには、マップにサイズが必要です)。そうでない場合は、IllegalStateExceptionがスローされます。
私は同じ問題を抱えていましたが、いくつかのデバッグの後、マップが表示されているときにホットリロードするとエラーが発生するようです。
ただし、マップを破棄した後でホットリロードすると、エラーを回避できます。
つまり、マップの複数のインスタンスがアクティブになるのを防ぐためです。
そのため、開発中のホットリロードの前にマップを破棄することをお勧めします。
本番バージョンでは、ユーザーはホットリロードできないため、プラットフォームの問題は発生しません。
私も同じ問題があり、flutter clean
解決できませんでした(flutterバージョン1.12.13 + hotfix 8)
しかし、それからウィジェットに一意のキーを追加する(その状態ではない)で問題が解決しました。
これを実証するための最小限の作業コードサンプル。
import 'package:flutter/material.Dart';
import 'package:google_maps_flutter/google_maps_flutter.Dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Map not crashing demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: LocationScreen(),
);
}
}
class LocationScreen extends StatefulWidget
{
final Key _mapKey = UniqueKey();
@override
_LocationScreenState createState() => _LocationScreenState();
}
class _LocationScreenState extends State<LocationScreen>
{
@override
Widget build(BuildContext context)
{
return Scaffold(
appBar: AppBar(title: const Text('Map not crashing demo')),
body: TheMap(key:widget._mapKey)
);
}
}
class TheMap extends StatefulWidget
{
///key is required, otherwise map crashes on hot reload
TheMap({ @required Key key})
:
super(key:key);
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<TheMap>
{
GoogleMapController _mapController ;
void _onMapCreated(GoogleMapController controller) {
_mapController = controller;
}
@override
Widget build(BuildContext context)
{
return Scaffold(
//also this avoids it crashing/breaking when the keyboard is up
resizeToAvoidBottomInset: false,
body: GoogleMap(
onMapCreated: _onMapCreated,
initialCameraPosition: CameraPosition(
target: const LatLng(30.0925973,31.3219982),
zoom: 11.0,
),
)
);
}
}
この問題は、複数のGoogleMapsウィジェットで同じコントローラーを使用することが原因です。 GoogleMapウィジェットを1つだけ作成し、GoogleMapControllerオブジェクトを使用して変更を加えます。
問題はここで参照されています: https://github.com/flutter/flutter/issues/45695