fix(bugs): update mapStyle when change theme
This commit is contained in:
@@ -2,10 +2,12 @@ import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:geolocator/geolocator.dart';
|
||||
import 'package:google_maps_cluster_manager_2/google_maps_cluster_manager_2.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart';
|
||||
import 'package:google_maps_flutter/google_maps_flutter.dart'
|
||||
hide ClusterManager, Cluster;
|
||||
import 'package:sfm_app/feature/devices/device_model.dart';
|
||||
import 'package:sfm_app/bloc/map_bloc.dart';
|
||||
import 'package:sfm_app/feature/map/widget/on_tap_marker_widget.dart';
|
||||
@@ -13,7 +15,6 @@ import 'package:sfm_app/product/base/bloc/base_bloc.dart';
|
||||
import 'package:sfm_app/product/constant/icon/icon_constants.dart';
|
||||
import 'package:sfm_app/product/permission/location_permission.dart';
|
||||
import 'package:sfm_app/product/services/api_services.dart';
|
||||
|
||||
import '../../product/constant/enums/app_theme_enums.dart';
|
||||
|
||||
class MapScreen extends StatefulWidget {
|
||||
@@ -32,7 +33,7 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
|
||||
late BitmapDescriptor fireStationIcon;
|
||||
late MapBloc mapBloc;
|
||||
late ClusterManager clusterManager;
|
||||
MapType mapType = MapType.terrain;
|
||||
// MapType mapType = MapType.terrain;
|
||||
APIServices apiServices = APIServices();
|
||||
final streamController = StreamController<GoogleMapController>.broadcast();
|
||||
List<Device> devices = [];
|
||||
@@ -50,30 +51,31 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
|
||||
);
|
||||
Set<Marker> markersAll = {};
|
||||
List<Marker> markers = [];
|
||||
LatLng myLocation = const LatLng(213761, 123123);
|
||||
Position? position;
|
||||
bool isAllowLocationPermission = false;
|
||||
String themeMode = "";
|
||||
// LatLng myLocation = const LatLng(213761, 123123);
|
||||
// Position? position;
|
||||
// bool isAllowLocationPermission = false;
|
||||
String themeMode = '';
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
mapBloc = BlocProvider.of(context);
|
||||
checkTheme();
|
||||
_loadIcons();
|
||||
getAllMarkers();
|
||||
clusterManager = _initClusterManager();
|
||||
DefaultAssetBundle.of(context)
|
||||
.loadString("assets/map_themes/maps_dark_theme.json")
|
||||
.then(
|
||||
(value) => {themeMode = value},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
streamController.close();
|
||||
_controller = Completer();
|
||||
super.dispose();
|
||||
_controller = Completer();
|
||||
streamController.close();
|
||||
}
|
||||
|
||||
void onMapCreated(GoogleMapController controller) {
|
||||
_controller.complete(controller);
|
||||
streamController.add(controller);
|
||||
clusterManager.setMapId(controller.mapId);
|
||||
checkTheme();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -88,40 +90,35 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
|
||||
stream: mapBloc.streamPolylines,
|
||||
builder: (context, polylinesSnapshot) {
|
||||
return StreamBuilder<String>(
|
||||
stream: mapBloc.streamMapTheme,
|
||||
builder: (context, mapThemeSnapshot) {
|
||||
return GoogleMap(
|
||||
initialCameraPosition: _myPosition,
|
||||
mapType: mapType,
|
||||
onMapCreated: (GoogleMapController controller) {
|
||||
controller.setMapStyle(themeMode);
|
||||
if (!_controller.isCompleted) {
|
||||
_controller.complete(controller);
|
||||
}
|
||||
streamController.sink.add(controller);
|
||||
clusterManager.setMapId(controller.mapId);
|
||||
},
|
||||
markers: markerSnapshot.data ?? markersAll
|
||||
..addAll(markers),
|
||||
zoomControlsEnabled: true,
|
||||
myLocationEnabled: true,
|
||||
mapToolbarEnabled: false,
|
||||
onCameraMove: (position) {
|
||||
clusterManager.onCameraMove(position);
|
||||
},
|
||||
onCameraIdle: () {
|
||||
clusterManager.updateMap();
|
||||
},
|
||||
polylines: {
|
||||
Polyline(
|
||||
polylineId: const PolylineId('router'),
|
||||
points: polylinesSnapshot.data ?? [],
|
||||
color: Colors.deepPurpleAccent,
|
||||
width: 8,
|
||||
),
|
||||
},
|
||||
);
|
||||
});
|
||||
stream: mapBloc.streamMapTheme,
|
||||
builder: (context, mapThemeSnapshot) {
|
||||
return GoogleMap(
|
||||
initialCameraPosition: _myPosition,
|
||||
// mapType: mapType,
|
||||
onMapCreated: onMapCreated,
|
||||
markers: markerSnapshot.data ?? markersAll
|
||||
..addAll(markers),
|
||||
zoomControlsEnabled: false,
|
||||
myLocationEnabled: true,
|
||||
mapToolbarEnabled: false,
|
||||
onCameraMove: (position) {
|
||||
clusterManager.onCameraMove(position);
|
||||
},
|
||||
onCameraIdle: () {
|
||||
clusterManager.updateMap();
|
||||
},
|
||||
polylines: {
|
||||
Polyline(
|
||||
polylineId: const PolylineId('router'),
|
||||
points: polylinesSnapshot.data ?? [],
|
||||
color: Colors.deepPurpleAccent,
|
||||
width: 8,
|
||||
),
|
||||
},
|
||||
style: mapThemeSnapshot.data,
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
@@ -134,22 +131,22 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
|
||||
void checkTheme() async {
|
||||
String theme = await apiServices.checkTheme();
|
||||
if (theme == AppThemes.LIGHT.name) {
|
||||
getThemeMode('assets/map_themes/maps_light_theme.json');
|
||||
themeMode = '';
|
||||
} else {
|
||||
getThemeMode('assets/map_themes/maps_dark_theme.json');
|
||||
themeMode = await _getFileData('assets/map_themes/maps_dark_theme.json');
|
||||
}
|
||||
}
|
||||
|
||||
void getThemeMode(String path) {
|
||||
DefaultAssetBundle.of(context)
|
||||
.loadString(path)
|
||||
.then((value) => {themeMode = value});
|
||||
mapBloc.sinkMapTheme.add(themeMode);
|
||||
}
|
||||
|
||||
Future<String> _getFileData(String path) async {
|
||||
return rootBundle.loadString(path);
|
||||
}
|
||||
|
||||
|
||||
Future<void> _loadIcons() async {
|
||||
List<Future<BitmapDescriptor>> iconFutures = imageAssets.map((asset) {
|
||||
return BitmapDescriptor.fromAssetImage(const ImageConfiguration(), asset);
|
||||
return BitmapDescriptor.asset(
|
||||
const ImageConfiguration(size: Size(50, 50)), asset);
|
||||
}).toList();
|
||||
|
||||
List<BitmapDescriptor> icons = await Future.wait(iconFutures);
|
||||
@@ -180,8 +177,8 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
|
||||
bool check = await checkLocationPermission(context);
|
||||
if (check == true) {
|
||||
Position position = await Geolocator.getCurrentPosition();
|
||||
// ignore: use_build_context_synchronously
|
||||
onTapMarker(
|
||||
// ignore: use_build_context_synchronously
|
||||
context,
|
||||
_controller,
|
||||
mapBloc,
|
||||
@@ -262,6 +259,7 @@ class _MapScreenState extends State<MapScreen> with WidgetsBindingObserver {
|
||||
|
||||
void _updateMarkers(Set<Marker> marker) {
|
||||
log("Update Marker");
|
||||
checkTheme();
|
||||
markersAll = marker;
|
||||
mapBloc.sinkAllMarker.add(marker);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user