Принудительно перестроить на iOS? - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь переключаться между добавлением и удалением полигонов на Картах Google. Я успешно это делаю, но только на Android. Приложение на iOS не перестраивается напрямую, и мне приходится взаимодействовать с другим элементом приложения (панелью поиска), чтобы оно перестраивалось.

Я использую провайдер для управления состоянием, а с ним я ' переключение между очисткой и добавлением полигонов. Код из виджета карт Google выглядит следующим образом:

Виджет карт

class MapWidget extends StatefulWidget {
  @override
  _MapWidgetState createState() => _MapWidgetState();
}

class _MapWidgetState extends State<MapWidget> {
  Completer<GoogleMapController> _completer;
  CampusPolygons _polygon;
  LatLng _currentLocation;
  CameraPosition _initialCameraLocation;
  StreamSubscription _locationSubscription;

  Location _location = new Location();
  String error;

  @override
  void initState() {
    super.initState();
    SizeConfig();
    //*****UNCOMMENT BELLOW FOR DARK MAP*****
    //*****MIGHT IMPLEMENT AUTOMATIC DARK MODE*****
//    rootBundle.loadString('assets/map_style.txt').then((string) {
//      _mapStyle = string;
//    });
    initPlatformState();
    _locationSubscription =
        _location.onLocationChanged().listen((newLocalData) {
      setState(() {
        _currentLocation =
            LatLng(newLocalData.latitude, newLocalData.longitude);
        _initialCameraLocation = CameraPosition(
          target: _currentLocation,
          zoom: CAMERA_ZOOM,
          tilt: CAMERA_TILT,
          bearing: CAMERA_BEARING,
        );
      });
    });
  }

  @override
  void dispose() {
    if (_locationSubscription != null) {
      _locationSubscription.cancel();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    SizeConfig().init(context);
    _completer = Provider.of<MapData>(context).getCompleter;
    _polygon = Provider.of<MapData>(context).getPolygon;

    while (_initialCameraLocation == null) {
      return Center(child: Text("Loading Map"));
    }

    return Stack(
      children: <Widget>[
        GoogleMap(
            myLocationEnabled: true,
            myLocationButtonEnabled: false,
            compassEnabled: false,
            tiltGesturesEnabled: true,
            buildingsEnabled: false,
            mapType: MapType.normal,
            polygons: _polygon.allPolygons,
            indoorViewEnabled: false,
            trafficEnabled: false,
            initialCameraPosition: _initialCameraLocation,
            onMapCreated: (controller) async {
              _completer.complete(controller);
//          controller.setMapStyle(_mapStyle);
            }),
        SafeArea(
          child: Padding(
            padding: EdgeInsets.only(
              top: SizeConfig.safeBlockVertical * 66,
              left: SizeConfig.safeBlockHorizontal * 83,
            ),
            child: FloatingActionButton(
              onPressed: () {
                _campus
                    ? () {
                        Provider.of<MapData>(context, listen: false)
                            .animateTo(SGW.latitude, SGW.longitude);
                        _campus = false;
                      }()
                    : () {
                        Provider.of<MapData>(context, listen: false)
                            .animateTo(LOYOLA.latitude, LOYOLA.longitude);
                        _campus = true;
                      }();
              },
              child: Icon(Icons.swap_calls),
              backgroundColor: Color(0xFFFFFFF8),
              foregroundColor: Color(0xFF656363),
              elevation: 5.0,
              heroTag: null,
            ),
          ),
        ),
        SafeArea(
          child: Padding(
            padding: EdgeInsets.only(
              top: SizeConfig.safeBlockVertical * 75,
              left: SizeConfig.safeBlockHorizontal * 83,
            ),
            child: FloatingActionButton(
              onPressed: () {
                Provider.of<MapData>(context, listen: false).animateTo(
                    _currentLocation.latitude, _currentLocation.longitude);
              },
              child: Icon(Icons.gps_fixed),
              backgroundColor: Color(0xFFFFFFF8),
              foregroundColor: Color(0xFF656363),
              elevation: 5.0,
              heroTag: null,
            ),
          ),
        ),
      ],
    );
  }

  initPlatformState() async {
    LocationData myLocation;
    try {
      myLocation = await _location.getLocation();
      error = "";
    } on PlatformException catch (e) {
      if (e.code == 'PERMISSION_DENIED') {
        debugPrint("Permission Denied");
        myLocation = null;
      }
    }
    setState(() {
      _currentLocation = LatLng(myLocation.latitude, myLocation.longitude);
      _initialCameraLocation = CameraPosition(
        target: _currentLocation,
        zoom: CAMERA_ZOOM,
        tilt: CAMERA_TILT,
        bearing: CAMERA_BEARING,
      );
    });
  }
}

Кнопка переключения

class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
  @override
  Widget build(BuildContext context) {
    CampusPolygons _polygon = Provider.of<MapData>(context).getPolygon;
    return AppBar(
      backgroundColor: Color(0xFF73C700),
      title: Text("ConNavigation"),
      actions: <Widget>[
        IconButton(
          icon: Icon(Icons.wb_sunny),
          onPressed: () {
            if (_polygon.allPolygons.isEmpty) {
              _polygon.addPolygons();
            } else {
              _polygon.clearPolygons();
            }
          },
        ),
        IconButton(
          icon: Icon(Icons.search),
          onPressed: () {
            showSearch(context: context, delegate: LocationSearch());
          },
        )
      ],
    );
  }

  @override
  Size get preferredSize => Size.fromHeight(kToolbarHeight);
}

Как бы я принудительно восстановить?

...