Flutter Google Maps, пытаясь создать уже созданный вид платформы, id просмотра: 0

17

Впервые Google Maps трепетает, загружается отлично, но при горячем перезапуске он переходит к исключению платформы

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 -0800Engine 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/SdkAndroid NDK location not configured (optional; useful for native profiling support)Platform android-29, build-tools 29.0.2Java 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.1Dart plugin version 191.8593Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[] Connected device (1 available)
    • vivo 172349269ad3 • android-arm64 • Android 9 (API 28)No issues found!
Лав Кушваха
источник

Ответы:

7

Чтобы решить эту проблему, я сделал следующее через терминал:

1- Поменял ветку на Мастер ветку:

flutter channel master

2- Модернизированный флаттер

flutter upgrade

3- Почистил код:

flutter clean

Юсеф Гамаль
источник
1
да, я сделал то же самое, и теперь работает горячая перезагрузка, изменил на главную ветку,
обновил
1
Переключение на мастер-канал и обновление флаттера решит проблему. Спасибо +1 за тебя.
Винот Вино
1
Это плохая идея, чтобы перейти на главную ветку. Мастер ветка самая нестабильная среди всех. Тот, кто ищет лучшее решение, должен рассмотреть другие ответы на этот вопрос. github.com/flutter/flutter/wiki/Flutter-build-release-channels
fotonmoton
1
это должно быть в flutter cleanнижнем регистре, если кто-то может редактировать его
Димитар
1
@Dimitar Я не заметил, что это прописные буквы, я только что отредактировал его, спасибо, что сообщили нам,
Юсеф Гамаль
7

У меня тоже была такая же проблема и использование 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,
          ),
        )
    );
  }
}
Eyad
источник
Спасибо Eyad, добавление ключей помогло решить проблему
Charden Daxicen
До выхода стабильной версии Flutter 1.17, я думаю, что это правильный ответ для проекта в производстве
Пабло Инсуа
Можете ли вы уточнить это, почему мы не используем ключ GoogleMap()?
Шахзад Акрам
4

Согласно API ,

Не меняйте камеру с этим обновлением камеры до тех пор, пока карта не будет подвергнута разметке (для того, чтобы этот метод правильно определял соответствующую ограничивающую рамку и уровень масштабирования, карта должна иметь размер). В противном случае будет выдано исключение IllegalStateException.

У меня была та же проблема, и после некоторой отладки, похоже, что всякий раз, когда вы выполняете горячую перезагрузку во время просмотра карты, выдает ошибку.

Но вы можете предотвратить ошибку, если перезагрузите ее после удаления карты.

Другими словами, он предотвращает активацию нескольких экземпляров карт.

Поэтому я бы посоветовал утилизировать карту перед горячей перезагрузкой во время разработки.

В рабочей версии пользователи не смогут выполнить горячую перезагрузку, поэтому они не столкнутся с проблемой платформы.

Стив Ким
источник
3

Проблема связана с использованием одного и того же контроллера в нескольких виджетах GoogleMaps. Создайте только один виджет GoogleMap и используйте объект GoogleMapController для внесения любых изменений.

Нихал Исмаил
источник