Skip to content

Commit b457f82

Browse files
Merge pull request #117 from Nesteo/map-marker-beta
Map marker beta
2 parents e0e3149 + a0bb227 commit b457f82

File tree

6 files changed

+173
-34
lines changed

6 files changed

+173
-34
lines changed

lib/blocs/mapcontrol_bloc/mapcontrol_bloc.dart

Lines changed: 113 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,22 @@ import 'dart:async';
22
import 'package:bloc/bloc.dart';
33
import 'package:geolocator/geolocator.dart';
44
import 'package:google_maps_flutter/google_maps_flutter.dart';
5+
import 'package:nesteo_app/model/nestingbox.dart';
56
import './mapcontrol.dart';
67

8+
typedef Marker MarkerUpdateAction(Marker marker);
9+
710
class MapControlBloc extends Bloc<MapControlEvent, MapControlState> {
811
GoogleMapController controller;
912
GoogleMap googleMap;
13+
Set<Marker> markers;
1014
LatLng location = LatLng(52.3537269, 9.724127);
1115
MapType mapType = MapType.normal;
1216
double zoom = 16;
1317
double tilt = 20;
18+
List<NestingBox> nestingBoxList;
19+
LatLngBounds bounds;
20+
bool created = false;
1421

1522
@override
1623
MapControlState get initialState => InitialMapControlState();
@@ -19,23 +26,25 @@ class MapControlBloc extends Bloc<MapControlEvent, MapControlState> {
1926
Stream<MapControlState> mapEventToState(
2027
MapControlEvent event,
2128
) async* {
22-
print(event.toString());
2329
if (event is RebuildMapEvent) {
2430
this.add(
2531
BuildMapEvent(
2632
mapType: this.mapType,
2733
tilt: this.tilt,
2834
zoom: this.zoom,
35+
markers: this.markers,
36+
nestingBoxList: event.nestingBoxList,
2937
),
3038
);
3139
}
40+
3241
if (event is BuildMapEvent) {
3342
if (this.state is! InitialMapControlState) {
3443
yield MapChangingState();
3544
}
36-
print('BuildMapEvent');
3745
location = this.location;
3846
mapType = event.mapType;
47+
nestingBoxList = event.nestingBoxList;
3948

4049
this.googleMap = GoogleMap(
4150
initialCameraPosition: CameraPosition(
@@ -44,25 +53,117 @@ class MapControlBloc extends Bloc<MapControlEvent, MapControlState> {
4453
tilt: event.tilt,
4554
),
4655
mapType: this.mapType,
47-
onMapCreated: (GoogleMapController newController) {
56+
onMapCreated: (GoogleMapController newController) async {
4857
this.controller = newController;
58+
this.bounds = await controller.getVisibleRegion();
59+
60+
if (await Geolocator().isLocationServiceEnabled()) {
61+
this.add(CenterMapEvent());
62+
}
63+
created = true;
64+
},
65+
markers: this.markers,
66+
mapToolbarEnabled: false,
67+
onCameraIdle: () async {
68+
if (created) {
69+
LatLngBounds newBounds = await controller.getVisibleRegion();
70+
bool changed =
71+
newBounds.northeast.latitude != bounds.northeast.latitude;
72+
print("${DateTime.now()} $changed");
73+
if (changed) {
74+
bounds = newBounds;
75+
print("${DateTime.now()} Sending Event");
76+
this.add(UpdateBoxMarkerEvent());
77+
}
78+
}
4979
},
5080
);
51-
yield MapReadyState();
81+
if (nestingBoxList.length == 0) {
82+
yield MapBuiltState();
83+
} else {
84+
yield MapReadyState();
85+
}
5286
}
87+
5388
if (event is CenterMapEvent) {
54-
print('Centering');
5589
Position position = await Geolocator()
5690
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
5791

58-
print('${position.latitude}, ${position.longitude}');
5992
this.location = LatLng(position.latitude, position.longitude);
60-
controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
61-
target: this.location,
62-
zoom: this.zoom,
63-
tilt: this.tilt,
64-
)));
65-
print('Animation finished');
93+
94+
this.add(
95+
AddMarkerEvent(
96+
location: this.location,
97+
infoWindowText: "You are here!",
98+
markerId: "user"),
99+
);
100+
101+
controller.animateCamera(
102+
CameraUpdate.newCameraPosition(
103+
CameraPosition(
104+
target: this.location,
105+
zoom: this.zoom,
106+
tilt: this.tilt,
107+
),
108+
),
109+
);
110+
}
111+
112+
if (event is AddMarkerEvent) {
113+
final Marker newMarker = Marker(
114+
markerId: MarkerId(event.markerId),
115+
position: event.location,
116+
infoWindow: InfoWindow(title: event.infoWindowText),
117+
onTap: () {},
118+
);
119+
120+
if (this.markers == null) {
121+
this.markers = Set<Marker>();
122+
}
123+
124+
this.markers.removeWhere((marker) {
125+
return marker.markerId.value == event.markerId;
126+
});
127+
this.markers.add(newMarker);
128+
this.add(RebuildMapEvent(nestingBoxList: nestingBoxList));
129+
}
130+
131+
if (event is UpdateBoxMarkerEvent && bounds != null) {
132+
print("${DateTime.now()} Receiving event (${nestingBoxList.length})");
133+
Set<Marker> boxMarkers = Set<Marker>();
134+
this.location = LatLng(
135+
bounds.northeast.latitude -
136+
(bounds.northeast.latitude - bounds.southwest.latitude) / 2,
137+
bounds.northeast.longitude -
138+
(bounds.northeast.longitude - bounds.southwest.longitude) / 2);
139+
140+
for (NestingBox box in this.nestingBoxList) {
141+
LatLng boxLoc = LatLng(box.coordinateLatitude, box.coordinateLongitude);
142+
if (bounds.contains(boxLoc)) {
143+
boxMarkers.add(
144+
Marker(
145+
markerId: MarkerId(box.id),
146+
position: LatLng(box.coordinateLatitude, box.coordinateLongitude),
147+
infoWindow: InfoWindow(title: box.id),
148+
onTap: () {},
149+
icon: BitmapDescriptor.defaultMarkerWithHue(
150+
BitmapDescriptor.hueGreen),
151+
),
152+
);
153+
}
154+
}
155+
156+
if (this.markers == null) {
157+
this.markers = Set<Marker>();
158+
} else {
159+
this.markers.retainWhere((marker) {
160+
return marker.markerId.value == "user";
161+
});
162+
}
163+
164+
this.markers.addAll(boxMarkers);
165+
166+
this.add(RebuildMapEvent(nestingBoxList: nestingBoxList));
66167
}
67168
}
68169
}

lib/blocs/mapcontrol_bloc/mapcontrol_event.dart

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:equatable/equatable.dart';
22
import 'package:google_maps_flutter/google_maps_flutter.dart';
33
import 'package:meta/meta.dart';
4+
import 'package:nesteo_app/model/nestingbox.dart';
45

56
abstract class MapControlEvent extends Equatable {
67
const MapControlEvent();
@@ -15,23 +16,36 @@ class BuildMapEvent extends MapControlEvent {
1516
final MapType mapType;
1617
final double zoom;
1718
final double tilt;
19+
final Set<Marker> markers;
20+
final List<NestingBox> nestingBoxList;
1821

1922
BuildMapEvent({
2023
@required this.mapType,
2124
@required this.zoom,
2225
@required this.tilt,
26+
@required this.markers,
27+
@required this.nestingBoxList,
2328
}) : super();
2429

2530
@override
2631
List<Object> get props => null;
2732
}
2833

29-
typedef Marker MarkerUpdateAction(Marker marker);
34+
class UpdateBoxMarkerEvent extends MapControlEvent {
35+
@override
36+
List<Object> get props => null;
37+
}
3038

3139
class AddMarkerEvent extends MapControlEvent {
32-
final Marker marker;
40+
final LatLng location;
41+
final String markerId;
42+
final String infoWindowText;
3343

34-
AddMarkerEvent({@required this.marker}) : super();
44+
AddMarkerEvent({
45+
@required this.location,
46+
@required this.markerId,
47+
@required this.infoWindowText,
48+
}) : super();
3549

3650
@override
3751
List<Object> get props => null;
@@ -47,6 +61,10 @@ class ChangeMapTypeEvent extends MapControlEvent {
4761
}
4862

4963
class RebuildMapEvent extends MapControlEvent {
64+
final List<NestingBox> nestingBoxList;
65+
66+
RebuildMapEvent({@required this.nestingBoxList}) : super();
67+
5068
@override
5169
List<Object> get props => null;
5270
}

lib/blocs/mapcontrol_bloc/mapcontrol_state.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@ class InitialMapControlState extends MapControlState {
99
List<Object> get props => [];
1010
}
1111

12+
class MapBuiltState extends MapControlState {
13+
@override
14+
List<Object> get props => [];
15+
}
16+
1217
class MapReadyState extends MapControlState {
1318
@override
1419
List<Object> get props => null;

lib/screens/boxlist_screen.dart

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import 'dart:math';
22

3+
import 'package:flutter/gestures.dart';
34
import 'package:flutter/material.dart';
45
import 'package:flutter_bloc/flutter_bloc.dart';
6+
import 'package:google_maps_flutter/google_maps_flutter.dart';
57
import 'package:nesteo_app/blocs/boxdata_bloc/boxdata.dart';
8+
import 'package:nesteo_app/blocs/mapcontrol_bloc/mapcontrol.dart';
69
import 'package:nesteo_app/blocs/pagecontrol_bloc/pagecontrol.dart';
710
import 'package:nesteo_app/blocs/snackbar_bloc/snackbar.dart';
811
import 'package:nesteo_app/screens/nesteo_screen.dart';
@@ -59,7 +62,8 @@ class BoxListScreen extends NesteoFramedScreen {
5962
@override
6063
Widget build(BuildContext context) {
6164
BoxDataBloc boxDataBloc = BlocProvider.of<BoxDataBloc>(context);
62-
boxDataBloc.add(GetAllBoxPreviewEvent());
65+
MapControlBloc mapControlBloc = BlocProvider.of<MapControlBloc>(context);
66+
6367
return BlocBuilder<BoxDataBloc, BoxDataState>(
6468
builder: (context, state) {
6569
if (state is InitialBoxDataState) {
@@ -94,15 +98,7 @@ class BoxListScreen extends NesteoFramedScreen {
9498
: Icon(Icons.check, size: 40, color: Colors.green),
9599
trailing: IconButton(
96100
icon: Icon(Icons.gps_fixed),
97-
onPressed: () {
98-
BlocProvider.of<SnackbarBloc>(context).add(
99-
ShowSnackbarEvent(
100-
color: Colors.lightGreen,
101-
text: "Currently in development",
102-
scaffoldContext: context,
103-
),
104-
);
105-
},
101+
onPressed: () {},
106102
),
107103
title: Text(boxDataBloc.nestingBoxList[index]
108104
.id), //create testdata for listview

lib/screens/map_screen.dart

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
22
import 'package:flutter_bloc/flutter_bloc.dart';
33
import 'package:geolocator/geolocator.dart';
44
import 'package:google_maps_flutter/google_maps_flutter.dart';
5+
import 'package:nesteo_app/blocs/boxdata_bloc/boxdata.dart';
6+
import 'package:nesteo_app/blocs/boxdata_bloc/boxdata_bloc.dart';
57
import 'package:nesteo_app/blocs/mapcontrol_bloc/mapcontrol.dart';
68
import 'package:nesteo_app/blocs/pagecontrol_bloc/pagecontrol.dart';
79
import 'package:nesteo_app/blocs/snackbar_bloc/snackbar.dart';
@@ -46,6 +48,8 @@ class MapScreen extends NesteoFramedScreen {
4648
: MapType.normal,
4749
tilt: mapControlBloc.tilt,
4850
zoom: mapControlBloc.zoom,
51+
markers: mapControlBloc.markers,
52+
nestingBoxList: mapControlBloc.nestingBoxList,
4953
),
5054
);
5155
},
@@ -67,24 +71,40 @@ class MapScreen extends NesteoFramedScreen {
6771
@override
6872
Widget build(BuildContext context) {
6973
MapControlBloc mapControlBloc = BlocProvider.of<MapControlBloc>(context);
74+
BoxDataBloc boxDataBloc = BlocProvider.of<BoxDataBloc>(context);
75+
7076
return Container(
7177
child: BlocBuilder<MapControlBloc, MapControlState>(
72-
builder: (context, state) {
73-
if (state is InitialMapControlState) {
74-
print('Constructing Map');
78+
condition: (previousState, state) =>
79+
state.runtimeType != previousState.runtimeType,
80+
builder: (context, mapState) {
81+
if (mapState is InitialMapControlState) {
82+
boxDataBloc.add(GetAllBoxPreviewEvent());
7583
mapControlBloc.add(
7684
BuildMapEvent(
7785
mapType: MapType.normal,
7886
zoom: 16,
7987
tilt: 20,
88+
markers: null,
89+
nestingBoxList: [],
8090
),
8191
);
82-
return CircularProgressIndicator();
8392
}
84-
if (state is MapReadyState) {
85-
return mapControlBloc.googleMap;
93+
94+
if (mapState is MapReadyState || mapState is MapBuiltState) {
95+
return BlocBuilder<BoxDataBloc, BoxDataState>(
96+
builder: (context, boxState) {
97+
if (boxState is BoxReadyState) {
98+
if (mapState is MapBuiltState) {
99+
mapControlBloc.add(RebuildMapEvent(
100+
nestingBoxList: boxDataBloc.nestingBoxList));
101+
}
102+
}
103+
return mapControlBloc.googleMap;
104+
},
105+
);
86106
}
87-
return CircularProgressIndicator();
107+
return LinearProgressIndicator();
88108
},
89109
),
90110
);

pubspec.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: nesteo_app
22
description: Nesting box management app for ringing associations.
33

4-
version: 0.3.10+13
4+
version: 0.3.11+14
55

66
environment:
77
sdk: ">=2.1.0 <3.0.0"
@@ -23,7 +23,6 @@ dependencies:
2323
meta: ^1.1.7
2424
equatable: ^0.6.0
2525
font_awesome_flutter: ^8.5.0
26-
datetime_picker_formfield: ^0.4.3
2726
geolocator: ^5.1.4
2827
back_button_interceptor: ^4.1.1
2928
intl: ^0.15.8

0 commit comments

Comments
 (0)