import 'dart:async'; import 'dart:typed_data'; import 'package:app_settings/app_settings.dart'; import 'package:custom_info_window/custom_info_window.dart'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:itp_app2/app/components/app_appbar.dart'; import 'package:itp_app2/app/components/app_appbar_single.dart'; import 'package:itp_app2/app/components/dialog/app_dialog.dart'; import 'package:itp_app2/app/components/indicator/app_loading_indicator.dart'; import 'package:itp_app2/provider/attraction/attractions_provider.dart'; import 'package:itp_app2/service/map_service.dart'; import 'package:itp_app2/service/realtime_location_service.dart'; import 'package:itp_app2/util/custom_info_window.dart'; import 'package:provider/src/provider.dart'; class MapSample extends StatefulWidget { //Eğer attraction detayından geliyorsa titlea göre tek marker göstercek final String targetTitle; final LatLng target; const MapSample({Key key, this.targetTitle, this.target}) : super(key: key); @override State createState() => MapSampleState(); } class MapSampleState extends State { GoogleMapController _controller; static BitmapDescriptor pinLocationIcon; Future _future; CustomInfoWindowController _customInfoWindowController = CustomInfoWindowController(); static CameraPosition _kGooglePlex; Future setCustomMarker() async { return await BitmapDescriptor.fromAssetImage(const ImageConfiguration(devicePixelRatio: 2, size: Size(10, 10)), 'assets/42.png').then((onValue) { return pinLocationIcon = onValue; }); } @override void initState() { _future = setCustomMarker(); _kGooglePlex = CameraPosition( target: widget.target ?? (RealtimeLocationService.position == null ? const LatLng(41.013611, 28.955) : LatLng(RealtimeLocationService.position.latitude, RealtimeLocationService.position.longitude)), zoom: RealtimeLocationService.position == null ? 10 : 15, ); if (RealtimeLocationService.position == null) { Future.delayed(const Duration(milliseconds: 500), () { AppDialog.show2( content: 'Please allow location access so we can show you attractions near your location.', buttonText: 'Allow Now', onTap: () { AppSettings.openLocationSettings(); }); }); } super.initState(); } @override Widget build(BuildContext context) { final p = context.read(); return Scaffold( appBar: widget.targetTitle != null ? appAppbarSingle(context, 'MAP') : null, body: FutureBuilder( future: _future, builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.active || snapshot.connectionState == ConnectionState.waiting) return AppLoadingIndicator(); return RepaintBoundary( child: Stack( children: [ GoogleMap( mapType: MapType.terrain, buildingsEnabled: true, indoorViewEnabled: true, mapToolbarEnabled: true, myLocationEnabled: true, myLocationButtonEnabled: true, compassEnabled: true, markers: widget.target != null ? {MapService?.instance?.getSingleMarker(widget.targetTitle)} : MapService.instance?.markers?.value ?? {}, initialCameraPosition: _kGooglePlex, onMapCreated: (GoogleMapController controller) { setState(() { _controller = controller; MapService.instance.controller.googleMapController = controller; }); }, onTap: (position) { MapService.instance?.controller?.hideInfoWindow(); }, onCameraMove: (controller) { MapService.instance?.controller?.onCameraMove(); }, ), CustomInfoWindow( controller: MapService.instance.controller, height: 72, width: 190, offset: 50, ), ], ), ); }, ), ); } _animateCamera(LatLng latLng) async { await _controller?.animateCamera(CameraUpdate.newCameraPosition( CameraPosition(target: LatLng(latLng.latitude, latLng.longitude), zoom: 16.5), )); } }