Попытка создать уже созданное представление платформы - PullRequest
0 голосов
/ 13 января 2020

Я использую трепетание карт Google в своем приложении. И я пытаюсь структурировать мое приложение с шаблоном BLo C. У меня возникла проблема, о которой многие говорили:

[ОШИБКА: flutter / lib / ui / ui_dart_state. cc (157)] Необработанное исключение: PlatformException (ошибка, java .lang) .IllegalStateException: при попытке создать уже созданное представление платформы, идентификатор представления: 0

, и я знаю, что есть несколько стандартных ответов:

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

Я действительно не знаю, как реализовать ответ 1, особенно когда я использую BLo C шаблон (я новичок в этом)

Для ответа 2. Я также не знаю, как добавить ключ. Я пытался, но это не сработало. Я добавил в комментарии, где Я попытался реализовать ключи

Дорогие друзья и незнакомцы, буду очень признателен за ваш ввод

import 'dart:async';
import 'package:flutter/material.dart';

import 'package:mybike/blocs/location_bloc.dart';
import 'package:mybike/blocs/location_event.dart';
import 'blocs/location_state.dart';

import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {

  // GlobalKey key = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Google Maps Demo',
      home: BlocProvider(
        create: (context) => LocationBloc(),
        child: MapSample(), //tried putting 'key: key' here
      ),
    );
  }
}

class MapSample extends StatefulWidget {

  //MapSample({Key key}) : super(key: key);

  @override
  State<MapSample> createState() => MapSampleState();
}

class MapSampleState extends State<MapSample> {
  Completer<GoogleMapController> _controller = Completer();

  static final CameraPosition _kLake = CameraPosition(
      bearing: 192.8334901395799,
      target: LatLng(37.43296265331129, -122.08832357078792),
      tilt: 59.440717697143555,
      zoom: 19.151926040649414);

  @override
  void initState() {
    super.initState();
    BlocProvider.of<LocationBloc>(context).add(FetchLocation());
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: BlocBuilder<LocationBloc, LocationState>(
        builder: (context, state) {
          if (state is LocationLoaded) {
            final position = state.position;
            return GoogleMap(
              mapType: MapType.hybrid,
              initialCameraPosition: CameraPosition(
                target: LatLng(position.latitude, position.longitude),
                zoom: 14.4746,
              ),
              myLocationEnabled: true,
              onMapCreated: (GoogleMapController controller) {
                _controller.complete(controller);
              },
            );
          }
          return Center(child: Text('Please enable Location'));
        },
      ),
      floatingActionButton: FloatingActionButton.extended(
        onPressed: _goToTheLake,
        label: Text('To the lake!'),
        icon: Icon(Icons.directions_boat),
      ),
    );
  }

  Future<void> _goToTheLake() async {
    final GoogleMapController controller = await _controller.future;
    controller.animateCamera(CameraUpdate.newCameraPosition(_kLake));
  }
}
...