처음으로 Google지도가 펄럭이고로드가 완벽하지만 핫 재시작하면 플랫폼 예외로 이동합니다.
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
답변
나는 또한 같은 문제가 있었고 사용 flutter clean
하면 나를 위해 그것을 해결하지 못했습니다 ( 플러터 버전 1.12.13 + 핫픽스 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,
),
)
);
}
}
답변
에 따르면 API ,
지도가 레이아웃 될 때까지이 카메라 업데이트로 카메라를 변경하지 마십시오 (이 방법으로 적절한 경계 상자 및 확대 / 축소 수준을 올바르게 결정하려면지도의 크기가 있어야합니다). 그렇지 않으면 IllegalStateException이 발생합니다.
나는 같은 문제가 있었고 디버깅 후 맵을 볼 때 핫 리로드 할 때마다 오류가 발생하는 것처럼 보입니다.
그러나 맵을 배치 한 후 핫 리로드하면 오류를 방지 할 수 있습니다.
다시 말해, 여러 개의지도 인스턴스가 활성화되는 것을 방지 할 수 있습니다.
따라서 개발 중에 핫 리로드하기 전에 맵을 폐기하는 것이 좋습니다.
프로덕션 버전에서는 사용자가 핫 리로드 할 수 없으므로 플랫폼 문제가 발생하지 않습니다.
답변
여러 GoogleMaps 위젯에서 동일한 컨트롤러를 사용하기 때문에 문제가 발생합니다. 하나의 GoogleMap 위젯 만 빌드하고 GoogleMapController 객체를 사용하여 변경하십시오.