Skip to content

Commit

Permalink
Merge pull request #117 from Nesteo/map-marker-beta
Browse files Browse the repository at this point in the history
Map marker beta
  • Loading branch information
SimonSchwierzeck authored Oct 29, 2019
2 parents e0e3149 + a0bb227 commit b457f82
Show file tree
Hide file tree
Showing 6 changed files with 173 additions and 34 deletions.
125 changes: 113 additions & 12 deletions lib/blocs/mapcontrol_bloc/mapcontrol_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,22 @@ import 'dart:async';
import 'package:bloc/bloc.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:nesteo_app/model/nestingbox.dart';
import './mapcontrol.dart';

typedef Marker MarkerUpdateAction(Marker marker);

class MapControlBloc extends Bloc<MapControlEvent, MapControlState> {
GoogleMapController controller;
GoogleMap googleMap;
Set<Marker> markers;
LatLng location = LatLng(52.3537269, 9.724127);
MapType mapType = MapType.normal;
double zoom = 16;
double tilt = 20;
List<NestingBox> nestingBoxList;
LatLngBounds bounds;
bool created = false;

@override
MapControlState get initialState => InitialMapControlState();
Expand All @@ -19,23 +26,25 @@ class MapControlBloc extends Bloc<MapControlEvent, MapControlState> {
Stream<MapControlState> mapEventToState(
MapControlEvent event,
) async* {
print(event.toString());
if (event is RebuildMapEvent) {
this.add(
BuildMapEvent(
mapType: this.mapType,
tilt: this.tilt,
zoom: this.zoom,
markers: this.markers,
nestingBoxList: event.nestingBoxList,
),
);
}

if (event is BuildMapEvent) {
if (this.state is! InitialMapControlState) {
yield MapChangingState();
}
print('BuildMapEvent');
location = this.location;
mapType = event.mapType;
nestingBoxList = event.nestingBoxList;

this.googleMap = GoogleMap(
initialCameraPosition: CameraPosition(
Expand All @@ -44,25 +53,117 @@ class MapControlBloc extends Bloc<MapControlEvent, MapControlState> {
tilt: event.tilt,
),
mapType: this.mapType,
onMapCreated: (GoogleMapController newController) {
onMapCreated: (GoogleMapController newController) async {
this.controller = newController;
this.bounds = await controller.getVisibleRegion();

if (await Geolocator().isLocationServiceEnabled()) {
this.add(CenterMapEvent());
}
created = true;
},
markers: this.markers,
mapToolbarEnabled: false,
onCameraIdle: () async {
if (created) {
LatLngBounds newBounds = await controller.getVisibleRegion();
bool changed =
newBounds.northeast.latitude != bounds.northeast.latitude;
print("${DateTime.now()} $changed");
if (changed) {
bounds = newBounds;
print("${DateTime.now()} Sending Event");
this.add(UpdateBoxMarkerEvent());
}
}
},
);
yield MapReadyState();
if (nestingBoxList.length == 0) {
yield MapBuiltState();
} else {
yield MapReadyState();
}
}

if (event is CenterMapEvent) {
print('Centering');
Position position = await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

print('${position.latitude}, ${position.longitude}');
this.location = LatLng(position.latitude, position.longitude);
controller.animateCamera(CameraUpdate.newCameraPosition(CameraPosition(
target: this.location,
zoom: this.zoom,
tilt: this.tilt,
)));
print('Animation finished');

this.add(
AddMarkerEvent(
location: this.location,
infoWindowText: "You are here!",
markerId: "user"),
);

controller.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: this.location,
zoom: this.zoom,
tilt: this.tilt,
),
),
);
}

if (event is AddMarkerEvent) {
final Marker newMarker = Marker(
markerId: MarkerId(event.markerId),
position: event.location,
infoWindow: InfoWindow(title: event.infoWindowText),
onTap: () {},
);

if (this.markers == null) {
this.markers = Set<Marker>();
}

this.markers.removeWhere((marker) {
return marker.markerId.value == event.markerId;
});
this.markers.add(newMarker);
this.add(RebuildMapEvent(nestingBoxList: nestingBoxList));
}

if (event is UpdateBoxMarkerEvent && bounds != null) {
print("${DateTime.now()} Receiving event (${nestingBoxList.length})");
Set<Marker> boxMarkers = Set<Marker>();
this.location = LatLng(
bounds.northeast.latitude -
(bounds.northeast.latitude - bounds.southwest.latitude) / 2,
bounds.northeast.longitude -
(bounds.northeast.longitude - bounds.southwest.longitude) / 2);

for (NestingBox box in this.nestingBoxList) {
LatLng boxLoc = LatLng(box.coordinateLatitude, box.coordinateLongitude);
if (bounds.contains(boxLoc)) {
boxMarkers.add(
Marker(
markerId: MarkerId(box.id),
position: LatLng(box.coordinateLatitude, box.coordinateLongitude),
infoWindow: InfoWindow(title: box.id),
onTap: () {},
icon: BitmapDescriptor.defaultMarkerWithHue(
BitmapDescriptor.hueGreen),
),
);
}
}

if (this.markers == null) {
this.markers = Set<Marker>();
} else {
this.markers.retainWhere((marker) {
return marker.markerId.value == "user";
});
}

this.markers.addAll(boxMarkers);

this.add(RebuildMapEvent(nestingBoxList: nestingBoxList));
}
}
}
24 changes: 21 additions & 3 deletions lib/blocs/mapcontrol_bloc/mapcontrol_event.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:equatable/equatable.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:meta/meta.dart';
import 'package:nesteo_app/model/nestingbox.dart';

abstract class MapControlEvent extends Equatable {
const MapControlEvent();
Expand All @@ -15,23 +16,36 @@ class BuildMapEvent extends MapControlEvent {
final MapType mapType;
final double zoom;
final double tilt;
final Set<Marker> markers;
final List<NestingBox> nestingBoxList;

BuildMapEvent({
@required this.mapType,
@required this.zoom,
@required this.tilt,
@required this.markers,
@required this.nestingBoxList,
}) : super();

@override
List<Object> get props => null;
}

typedef Marker MarkerUpdateAction(Marker marker);
class UpdateBoxMarkerEvent extends MapControlEvent {
@override
List<Object> get props => null;
}

class AddMarkerEvent extends MapControlEvent {
final Marker marker;
final LatLng location;
final String markerId;
final String infoWindowText;

AddMarkerEvent({@required this.marker}) : super();
AddMarkerEvent({
@required this.location,
@required this.markerId,
@required this.infoWindowText,
}) : super();

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

class RebuildMapEvent extends MapControlEvent {
final List<NestingBox> nestingBoxList;

RebuildMapEvent({@required this.nestingBoxList}) : super();

@override
List<Object> get props => null;
}
5 changes: 5 additions & 0 deletions lib/blocs/mapcontrol_bloc/mapcontrol_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@ class InitialMapControlState extends MapControlState {
List<Object> get props => [];
}

class MapBuiltState extends MapControlState {
@override
List<Object> get props => [];
}

class MapReadyState extends MapControlState {
@override
List<Object> get props => null;
Expand Down
16 changes: 6 additions & 10 deletions lib/screens/boxlist_screen.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import 'dart:math';

import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:nesteo_app/blocs/boxdata_bloc/boxdata.dart';
import 'package:nesteo_app/blocs/mapcontrol_bloc/mapcontrol.dart';
import 'package:nesteo_app/blocs/pagecontrol_bloc/pagecontrol.dart';
import 'package:nesteo_app/blocs/snackbar_bloc/snackbar.dart';
import 'package:nesteo_app/screens/nesteo_screen.dart';
Expand Down Expand Up @@ -59,7 +62,8 @@ class BoxListScreen extends NesteoFramedScreen {
@override
Widget build(BuildContext context) {
BoxDataBloc boxDataBloc = BlocProvider.of<BoxDataBloc>(context);
boxDataBloc.add(GetAllBoxPreviewEvent());
MapControlBloc mapControlBloc = BlocProvider.of<MapControlBloc>(context);

return BlocBuilder<BoxDataBloc, BoxDataState>(
builder: (context, state) {
if (state is InitialBoxDataState) {
Expand Down Expand Up @@ -94,15 +98,7 @@ class BoxListScreen extends NesteoFramedScreen {
: Icon(Icons.check, size: 40, color: Colors.green),
trailing: IconButton(
icon: Icon(Icons.gps_fixed),
onPressed: () {
BlocProvider.of<SnackbarBloc>(context).add(
ShowSnackbarEvent(
color: Colors.lightGreen,
text: "Currently in development",
scaffoldContext: context,
),
);
},
onPressed: () {},
),
title: Text(boxDataBloc.nestingBoxList[index]
.id), //create testdata for listview
Expand Down
34 changes: 27 additions & 7 deletions lib/screens/map_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:nesteo_app/blocs/boxdata_bloc/boxdata.dart';
import 'package:nesteo_app/blocs/boxdata_bloc/boxdata_bloc.dart';
import 'package:nesteo_app/blocs/mapcontrol_bloc/mapcontrol.dart';
import 'package:nesteo_app/blocs/pagecontrol_bloc/pagecontrol.dart';
import 'package:nesteo_app/blocs/snackbar_bloc/snackbar.dart';
Expand Down Expand Up @@ -46,6 +48,8 @@ class MapScreen extends NesteoFramedScreen {
: MapType.normal,
tilt: mapControlBloc.tilt,
zoom: mapControlBloc.zoom,
markers: mapControlBloc.markers,
nestingBoxList: mapControlBloc.nestingBoxList,
),
);
},
Expand All @@ -67,24 +71,40 @@ class MapScreen extends NesteoFramedScreen {
@override
Widget build(BuildContext context) {
MapControlBloc mapControlBloc = BlocProvider.of<MapControlBloc>(context);
BoxDataBloc boxDataBloc = BlocProvider.of<BoxDataBloc>(context);

return Container(
child: BlocBuilder<MapControlBloc, MapControlState>(
builder: (context, state) {
if (state is InitialMapControlState) {
print('Constructing Map');
condition: (previousState, state) =>
state.runtimeType != previousState.runtimeType,
builder: (context, mapState) {
if (mapState is InitialMapControlState) {
boxDataBloc.add(GetAllBoxPreviewEvent());
mapControlBloc.add(
BuildMapEvent(
mapType: MapType.normal,
zoom: 16,
tilt: 20,
markers: null,
nestingBoxList: [],
),
);
return CircularProgressIndicator();
}
if (state is MapReadyState) {
return mapControlBloc.googleMap;

if (mapState is MapReadyState || mapState is MapBuiltState) {
return BlocBuilder<BoxDataBloc, BoxDataState>(
builder: (context, boxState) {
if (boxState is BoxReadyState) {
if (mapState is MapBuiltState) {
mapControlBloc.add(RebuildMapEvent(
nestingBoxList: boxDataBloc.nestingBoxList));
}
}
return mapControlBloc.googleMap;
},
);
}
return CircularProgressIndicator();
return LinearProgressIndicator();
},
),
);
Expand Down
3 changes: 1 addition & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: nesteo_app
description: Nesting box management app for ringing associations.

version: 0.3.10+13
version: 0.3.11+14

environment:
sdk: ">=2.1.0 <3.0.0"
Expand All @@ -23,7 +23,6 @@ dependencies:
meta: ^1.1.7
equatable: ^0.6.0
font_awesome_flutter: ^8.5.0
datetime_picker_formfield: ^0.4.3
geolocator: ^5.1.4
back_button_interceptor: ^4.1.1
intl: ^0.15.8
Expand Down

0 comments on commit b457f82

Please sign in to comment.