Flutter Google Maps, Tentando criar uma visualização da plataforma já criada, id da visualização: 0

17

Pela primeira vez, o google maps vibra, carrega perfeito, mas quando reinicializado a quente, vai para a exceção da plataforma

google_maps_flutter: ^ 0.5.21 + 15

Github [google_maps_flutter] Tentando criar uma visualização da plataforma já criada # 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

Flutter doctor -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!
Lav Kushwaha
fonte

Respostas:

7

Para resolver esse problema, fiz o seguinte através do terminal:

1- Alterou a ramificação para Master branch:

flutter channel master

2- Flutter atualizado

flutter upgrade

3- Limpe o código:

flutter clean

Yousef Gamal
fonte
11
sim, eu fiz o mesmo e a recarga a quente agora está funcionando, alterada para master branch, atualize a vibração e a vibração limpa e o aplicativo está funcionando
Lav Kushwaha
11
Mudar para o canal principal e atualizar o flutter resolverá o problema. Obrigado +1 por você.
Vinoth Vino 18/03
11
É uma má idéia mudar para o ramo principal. O ramo principal é mais instável entre todos. Quem procura uma solução melhor deve considerar outras respostas para esta pergunta. github.com/flutter/flutter/wiki/Flutter-build-release-channels
fotonmoton 18/03
11
deve ser flutter cleancom letras minúsculas se alguém puder editá-lo
Dimitar
11
@Dimitar Eu não notei que estava em maiúscula, eu apenas editei, obrigado por nos informar,
Yousef Gamal
7

Eu também tive o mesmo problema e o uso flutter cleannão o resolveu ( versão flutter 1.12.13 + hotfix 8 )

Mas, então, adicionar uma chave exclusiva ao widget (não ao seu estado) resolveu o problema para mim.

amostra mínima de código de trabalho para demonstrar isso.

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
fonte
Obrigado Eyad, a adição de chaves ajudou a resolver o problema
Charden Daxicen
Até o lançamento do Flutter 1.17 estável, acho que esta é a resposta correta para um projeto em produção
Pablo Insua
Você pode explicar que por que não usamos uma chave GoogleMap()?
Shahzad Akram
4

De acordo com a API ,

Não altere a câmera com esta atualização da câmera até que o mapa seja submetido ao layout (para que este método determine corretamente a caixa delimitadora e o nível de zoom apropriados, o mapa deve ter um tamanho). Caso contrário, uma IllegalStateException será lançada.

Eu tive o mesmo problema e, após alguma depuração, parece que sempre que você recarrega a quente enquanto o mapa está em exibição, ele gera o erro.

Mas você pode evitar o erro se recarregar a quente após descartar o mapa.

Em outras palavras, existe para impedir que várias instâncias de mapas sejam ativas.

Então, sugiro que você elimine o mapa antes de recarregar a quente durante o desenvolvimento.

Em uma versão de produção, os usuários não poderão recarregar a quente, portanto, não encontrarão o problema da plataforma.

Steve Kim
fonte
3

O problema ocorre devido ao uso do mesmo controlador em vários widgets do GoogleMaps. Crie apenas um widget do GoogleMap e use o objeto GoogleMapController para fazer alterações.

Nihal Ismail
fonte