cleanup code

This commit is contained in:
Freek van de Ven 2021-09-30 10:09:57 +02:00
parent b630b54519
commit 54fa43ebbf
8 changed files with 486 additions and 180 deletions

View file

@ -1,4 +1,208 @@
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
always_use_package_imports: true
avoid_dynamic_calls: true
avoid_empty_else: true
avoid_print: true
avoid_relative_lib_imports: true
avoid_returning_null_for_future: true
avoid_slow_async_io: true
avoid_type_to_string: true
avoid_types_as_parameter_names: true
avoid_web_libraries_in_flutter: true
cancel_subscriptions: true
close_sinks: true
comment_references: false
control_flow_in_finally: true
diagnostic_describe_all_properties: false
empty_statements: true
hash_and_equals: true
invariant_booleans: true
iterable_contains_unrelated_type: true
list_remove_unrelated_type: true
literal_only_boolean_expressions: true
no_adjacent_strings_in_list: true
no_duplicate_case_values: true
no_logic_in_create_state: true
prefer_void_to_null: true
test_types_in_equals: true
throw_in_finally: true
unnecessary_statements: true
unrelated_type_equality_checks: true
use_build_context_synchronously: true
use_key_in_widget_constructors: true
valid_regexps: true
always_declare_return_types: true
always_put_control_body_on_new_line: true
always_put_required_named_parameters_first: true
always_require_non_null_named_parameters: true
always_specify_types: false
annotate_overrides: true
avoid_annotating_with_dynamic: false
avoid_bool_literals_in_conditional_expressions: true
avoid_catches_without_on_clauses: false
avoid_catching_errors: false
avoid_classes_with_only_static_members: true
avoid_double_and_int_checks: true
avoid_equals_and_hash_code_on_mutable_classes: false
avoid_escaping_inner_quotes: false
avoid_field_initializers_in_const_classes: true
avoid_function_literals_in_foreach_calls: true
avoid_implementing_value_types: true
avoid_init_to_null: true
avoid_multiple_declarations_per_line: true
avoid_null_checks_in_equality_operators: true
avoid_private_typedef_functions: true
avoid_renaming_method_parameters: true
avoid_return_types_on_setters: true
avoid_returning_null: true
avoid_returning_null_for_void: true
avoid_returning_this: true
avoid_shadowing_type_parameters: true
avoid_single_cascade_in_expression_statements: true
avoid_types_on_closure_parameters: false
avoid_unnecessary_containers: false
avoid_unused_constructor_parameters: true
avoid_void_async: true
await_only_futures: true
camel_case_extensions: true
camel_case_types: true
cascade_invocations: true
cast_nullable_to_non_nullable: true
constant_identifier_names: true
curly_braces_in_flow_control_structures: true
deprecated_consistency: true
directives_ordering: true
do_not_use_environment: true
empty_catches: true
empty_constructor_bodies: true
eol_at_end_of_file: true
exhaustive_cases: true
file_names: true
flutter_style_todos: true
implementation_imports: true
join_return_with_assignment: true
leading_newlines_in_multiline_strings: true
library_names: true
library_prefixes: true
library_private_types_in_public_api: true
lines_longer_than_80_chars: true
missing_whitespace_between_adjacent_strings: true
no_default_cases: true
non_constant_identifier_names: true
noop_primitive_operations: true
null_check_on_nullable_type_parameter: true
null_closures: true
omit_local_variable_types: true
one_member_abstracts: true
only_throw_errors: true
overridden_fields: true
package_api_docs: true
package_prefixed_library_names: true
parameter_assignments: true
prefer_adjacent_string_concatenation: true
prefer_asserts_in_initializer_lists: true
prefer_asserts_with_message: true
prefer_collection_literals: true
prefer_conditional_assignment: true
prefer_const_constructors: false
prefer_const_constructors_in_immutables: true
prefer_const_declarations: false
prefer_const_literals_to_create_immutables: false
prefer_constructors_over_static_methods: true
prefer_contains: true
prefer_double_quotes: false
prefer_equal_for_default_values: true
prefer_expression_function_bodies: false
prefer_final_fields: true
prefer_final_in_for_each: true
prefer_final_locals: false
prefer_final_parameters: false
prefer_for_elements_to_map_fromIterable: true
prefer_foreach: true
prefer_function_declarations_over_variables: true
prefer_generic_function_type_aliases: true
prefer_if_elements_to_conditional_expressions: true
prefer_if_null_operators: true
prefer_initializing_formals: true
prefer_inlined_adds: true
prefer_int_literals: false
prefer_interpolation_to_compose_strings: true
prefer_is_empty: true
prefer_is_not_empty: true
prefer_is_not_operator: true
prefer_iterable_whereType: true
prefer_mixin: true
prefer_null_aware_method_calls: true
prefer_null_aware_operators: true
prefer_single_quotes: true
prefer_spread_collections: true
prefer_typing_uninitialized_variables: true
public_member_api_docs: false
recursive_getters: true
require_trailing_commas: true
sized_box_for_whitespace: true
slash_for_doc_comments: true
sort_child_properties_last: true
sort_constructors_first: true
sort_unnamed_constructors_first: true
tighten_type_of_initializing_formals: true
type_annotate_public_apis: true
type_init_formals: true
unawaited_futures: true
unnecessary_await_in_return: true
unnecessary_brace_in_string_interps: true
unnecessary_const: false
unnecessary_constructor_name: true
unnecessary_final: true
unnecessary_getters_setters: true
unnecessary_lambdas: true
unnecessary_new: true
unnecessary_null_aware_assignments: true
unnecessary_null_checks: true
unnecessary_null_in_if_null_operators: true
unnecessary_nullable_for_final_variable_declarations: true
unnecessary_overrides: true
unnecessary_parenthesis: true
unnecessary_raw_strings: true
unnecessary_string_escapes: true
unnecessary_string_interpolations: true
unnecessary_this: true
use_full_hex_values_for_flutter_colors: true
use_function_type_syntax_for_parameters: true
use_if_null_to_convert_nulls_to_bools: true
use_is_even_rather_than_modulo: true
use_late_for_private_fields_and_variables: true
use_named_constants: true
use_raw_strings: false
use_rethrow_when_possible: true
use_setters_to_change_properties: true
use_string_buffers: true
use_test_throws_matchers: true
use_to_and_as_if_applicable: true
void_checks: true
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View file

@ -22,8 +22,188 @@ linter:
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
always_use_package_imports: true
avoid_dynamic_calls: true
avoid_empty_else: true
avoid_print: true
avoid_relative_lib_imports: true
avoid_returning_null_for_future: true
avoid_slow_async_io: true
avoid_type_to_string: true
avoid_types_as_parameter_names: true
avoid_web_libraries_in_flutter: true
cancel_subscriptions: true
close_sinks: true
comment_references: false
control_flow_in_finally: true
diagnostic_describe_all_properties: false
empty_statements: true
hash_and_equals: true
invariant_booleans: true
iterable_contains_unrelated_type: true
list_remove_unrelated_type: true
literal_only_boolean_expressions: true
no_adjacent_strings_in_list: true
no_duplicate_case_values: true
no_logic_in_create_state: true
prefer_void_to_null: true
test_types_in_equals: true
throw_in_finally: true
unnecessary_statements: true
unrelated_type_equality_checks: true
use_build_context_synchronously: true
use_key_in_widget_constructors: true
valid_regexps: true
always_declare_return_types: true
always_put_control_body_on_new_line: true
always_put_required_named_parameters_first: true
always_require_non_null_named_parameters: true
always_specify_types: false
annotate_overrides: true
avoid_annotating_with_dynamic: false
avoid_bool_literals_in_conditional_expressions: true
avoid_catches_without_on_clauses: false
avoid_catching_errors: false
avoid_classes_with_only_static_members: true
avoid_double_and_int_checks: true
avoid_equals_and_hash_code_on_mutable_classes: false
avoid_escaping_inner_quotes: false
avoid_field_initializers_in_const_classes: true
avoid_function_literals_in_foreach_calls: true
avoid_implementing_value_types: true
avoid_init_to_null: true
avoid_multiple_declarations_per_line: true
avoid_null_checks_in_equality_operators: true
avoid_private_typedef_functions: true
avoid_renaming_method_parameters: true
avoid_return_types_on_setters: true
avoid_returning_null: true
avoid_returning_null_for_void: true
avoid_returning_this: true
avoid_shadowing_type_parameters: true
avoid_single_cascade_in_expression_statements: true
avoid_types_on_closure_parameters: false
avoid_unnecessary_containers: false
avoid_unused_constructor_parameters: true
avoid_void_async: true
await_only_futures: true
camel_case_extensions: true
camel_case_types: true
cascade_invocations: true
cast_nullable_to_non_nullable: true
constant_identifier_names: true
curly_braces_in_flow_control_structures: true
deprecated_consistency: true
directives_ordering: true
do_not_use_environment: true
empty_catches: true
empty_constructor_bodies: true
eol_at_end_of_file: true
exhaustive_cases: true
file_names: true
flutter_style_todos: true
implementation_imports: true
join_return_with_assignment: true
leading_newlines_in_multiline_strings: true
library_names: true
library_prefixes: true
library_private_types_in_public_api: true
lines_longer_than_80_chars: true
missing_whitespace_between_adjacent_strings: true
no_default_cases: true
non_constant_identifier_names: true
noop_primitive_operations: true
null_check_on_nullable_type_parameter: true
null_closures: true
omit_local_variable_types: true
one_member_abstracts: true
only_throw_errors: true
overridden_fields: true
package_api_docs: true
package_prefixed_library_names: true
parameter_assignments: true
prefer_adjacent_string_concatenation: true
prefer_asserts_in_initializer_lists: true
prefer_asserts_with_message: true
prefer_collection_literals: true
prefer_conditional_assignment: true
prefer_const_constructors: false
prefer_const_constructors_in_immutables: true
prefer_const_declarations: false
prefer_const_literals_to_create_immutables: false
prefer_constructors_over_static_methods: true
prefer_contains: true
prefer_double_quotes: false
prefer_equal_for_default_values: true
prefer_expression_function_bodies: false
prefer_final_fields: true
prefer_final_in_for_each: true
prefer_final_locals: false
prefer_final_parameters: false
prefer_for_elements_to_map_fromIterable: true
prefer_foreach: true
prefer_function_declarations_over_variables: true
prefer_generic_function_type_aliases: true
prefer_if_elements_to_conditional_expressions: true
prefer_if_null_operators: true
prefer_initializing_formals: true
prefer_inlined_adds: true
prefer_int_literals: false
prefer_interpolation_to_compose_strings: true
prefer_is_empty: true
prefer_is_not_empty: true
prefer_is_not_operator: true
prefer_iterable_whereType: true
prefer_mixin: true
prefer_null_aware_method_calls: true
prefer_null_aware_operators: true
prefer_single_quotes: true
prefer_spread_collections: true
prefer_typing_uninitialized_variables: true
public_member_api_docs: false
recursive_getters: true
require_trailing_commas: true
sized_box_for_whitespace: true
slash_for_doc_comments: true
sort_child_properties_last: true
sort_constructors_first: true
sort_unnamed_constructors_first: true
tighten_type_of_initializing_formals: true
type_annotate_public_apis: true
type_init_formals: true
unawaited_futures: true
unnecessary_await_in_return: true
unnecessary_brace_in_string_interps: true
unnecessary_const: false
unnecessary_constructor_name: true
unnecessary_final: true
unnecessary_getters_setters: true
unnecessary_lambdas: true
unnecessary_new: true
unnecessary_null_aware_assignments: true
unnecessary_null_checks: true
unnecessary_null_in_if_null_operators: true
unnecessary_nullable_for_final_variable_declarations: true
unnecessary_overrides: true
unnecessary_parenthesis: true
unnecessary_raw_strings: true
unnecessary_string_escapes: true
unnecessary_string_interpolations: true
unnecessary_this: true
use_full_hex_values_for_flutter_colors: true
use_function_type_syntax_for_parameters: true
use_if_null_to_convert_nulls_to_bools: true
use_is_even_rather_than_modulo: true
use_late_for_private_fields_and_variables: true
use_named_constants: true
use_raw_strings: false
use_rethrow_when_possible: true
use_setters_to_change_properties: true
use_string_buffers: true
use_test_throws_matchers: true
use_to_and_as_if_applicable: true
void_checks: true
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

View file

@ -1,78 +0,0 @@
import 'package:flutter/material.dart';
main() {
runApp(MaterialApp(
home: Scaffold(
body: Center(
child: ControlledWidget(
initialString: 'old value',
onCreate: (controller) async {
Future.delayed(const Duration(seconds: 5), () {
controller.value = 'new value';
});
}),
),
),
));
}
enum TimePrecision {
updateOnly,
everySecond,
everyMinute
}
class ControlledWidget extends StatefulWidget {
final void Function(MyController) onCreate;
final String? initialString;
final TimePrecision precision;
const ControlledWidget({
Key? key,
required this.onCreate,
this.initialString,
this.precision = TimePrecision.updateOnly,
}) : super(key: key);
@override
_ControlledWidgetState createState() => _ControlledWidgetState();
}
class _ControlledWidgetState extends State<ControlledWidget> {
late final MyController _controller;
@override
void initState() {
_controller = MyController(widget.initialString ?? '');
_controller.addListener(_onChange);
widget.onCreate(_controller);
super.initState();
}
void _onChange() {
setState(() {});
}
@override
Widget build(BuildContext context) {
return Text(_controller.value);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
}
class MyController extends ChangeNotifier {
String _currentString;
MyController(String initial) : _currentString = initial;
String get value => _currentString;
set value(String value) {
_currentString = value;
notifyListeners();
}
}

View file

@ -2,7 +2,6 @@ import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:google_track_trace/google_track_trace.dart';
class TrackTraceDemo extends StatefulWidget {
@ -27,22 +26,25 @@ class _TrackTraceDemoState extends State<TrackTraceDemo> {
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: (controller == null || controller!.route == null)
? const Text('TrackTrace example')
: Text(controller!.route!.duration.toString() +
' seconds, afstand: ' +
(controller!.route!.distance / 1000).toString() +
' km')),
title: (controller == null || controller!.route == null)
? const Text('TrackTrace example')
: Text(
'${controller!.route!.duration} seconds, afstand: '
'${controller!.route!.distance / 1000} km',
),
),
body: GoogleTrackTraceMap(
startPosition: const Marker(
markerId: MarkerId('Start locatie'),
position: LatLng(52.356057, 4.897540),
),
destinationPosition: const Marker(
markerId: MarkerId('Bestemming Locatie'),
position: LatLng(52.364709, 4.877157)),
markerId: MarkerId('Bestemming Locatie'),
position: LatLng(52.364709, 4.877157),
),
googleAPIKey: 'AIzaSyDaxZX8TeQeVf5tW-D6A66WLl20arbWV6c',
travelMode: TravelMode.bicycling,
mapType: MapType.satellite,
routeUpdateInterval: 60,
timerPrecision: TimePrecision.everySecond,
zoomGesturesEnabled: true,
@ -66,15 +68,26 @@ class _TrackTraceDemoState extends State<TrackTraceDemo> {
// 51.939909, 6.314950 SE
if (controller != null) {
controller!.start = Marker(
markerId: const MarkerId('Start Locatie'),
position: LatLng(51.93 + Random().nextDouble() * 0.06,
6.23 + Random().nextDouble() * 0.08));
markerId: const MarkerId('Start Locatie'),
position: LatLng(
51.93 + Random().nextDouble() * 0.06,
6.23 + Random().nextDouble() * 0.08,
),
);
}
}
void moveAlongRoute() {
if (controller != null && controller!.route != null && controller!.route!.line.length > 1) {
controller!.start = Marker(markerId: const MarkerId('Start Locatie'), position: LatLng(controller!.route!.line[1].latitude, controller!.route!.line[1].longitude));
if (controller != null &&
controller!.route != null &&
controller!.route!.line.length > 1) {
controller!.start = Marker(
markerId: const MarkerId('Start Locatie'),
position: LatLng(
controller!.route!.line[1].latitude,
controller!.route!.line[1].longitude,
),
);
}
}
}

View file

@ -7,10 +7,13 @@ import 'dart:math';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:http/http.dart' as http;
part 'src/google_map.dart';
export 'package:google_maps_flutter/google_maps_flutter.dart'
show MapType, Marker, MarkerId, Polyline, PolylineId, LatLng;
part 'src/controller.dart';
part 'src/directions_controller.dart';
part 'src/directions_repository.dart';
part 'src/google_map.dart';

View file

@ -1,15 +1,15 @@
part of google_track_trace;
class TrackTraceController extends ChangeNotifier {
GoogleMapController? _mapController;
Marker _startPosition;
Marker _destinationPosition;
TrackTraceRoute? _route;
TrackTraceController(Marker start, Marker destination)
: _startPosition = start,
_destinationPosition = destination;
GoogleMapController? mapController;
Marker _startPosition;
Marker _destinationPosition;
TrackTraceRoute? _route;
set start(Marker start) {
_startPosition = start;
notifyListeners();
@ -31,44 +31,25 @@ class TrackTraceController extends ChangeNotifier {
notifyListeners();
}
set mapController(GoogleMapController? controller) {
_mapController = controller;
}
GoogleMapController? get mapController => _mapController;
@override
void dispose() {
_mapController?.dispose();
mapController?.dispose();
super.dispose();
}
}
class TrackTraceRoute {
TrackTraceRoute(
int durationValue, int distanceValue, List<PointLatLng> lineValue,)
: duration = durationValue,
distance = distanceValue,
line = lineValue;
/// route duration in seconds
int _duration = 0;
int duration = 0;
/// route distance in meters
int _distance = 0;
int distance = 0;
/// route edge points
final List<PointLatLng> line;
TrackTraceRoute(
int durationValue, int distanceValue, List<PointLatLng> lineValue)
: _duration = durationValue,
_distance = distanceValue,
line = lineValue;
int get distance => _distance;
int get duration => _duration;
set distance(int distance) {
_distance = distance;
}
set duration(int duration) {
_duration = duration;
}
}

View file

@ -13,11 +13,10 @@ class DirectionsRepository {
required String key,
}) async {
try {
final queryParameters = {
var queryParameters = {
'origin': '${origin.latitude},${origin.longitude}',
'destination': '${destination.latitude},${destination.longitude}',
'key':
key, // get this key from the controller
'key': key, // get this key from the controller
'mode': <TravelMode, String>{
TravelMode.driving: 'driving',
TravelMode.bicycling: 'bicycling',
@ -25,26 +24,25 @@ class DirectionsRepository {
TravelMode.walking: 'walking',
}[mode],
};
final uri = Uri.https('maps.googleapis.com', _baseUrl, queryParameters);
final response = await http.get(uri, headers: {
HttpHeaders.contentTypeHeader: 'application/json',
});
var uri = Uri.https('maps.googleapis.com', _baseUrl, queryParameters);
var response = await http.get(
uri,
headers: {
HttpHeaders.contentTypeHeader: 'application/json',
},
);
if (response.statusCode == 200) {
return Directions.fromMap(jsonDecode(response.body));
}
} on HttpException catch (e) {
print(e.message);
debugPrint(e.message);
}
throw GoogleMapsException('Unable to retrieve directions from Google Maps API');
throw GoogleMapsException(
'Unable to retrieve directions from Google Maps API',);
}
}
class Directions {
final LatLngBounds bounds;
final List<PointLatLng> polylinePoints;
final int totalDistance;
final int totalDuration;
const Directions({
required this.bounds,
required this.polylinePoints,
@ -58,19 +56,19 @@ class Directions {
throw GoogleMapsException('No Routes available');
}
final data = Map<String, dynamic>.from(map['routes'][0]);
var data = Map<String, dynamic>.from((map['routes'] as List)[0]);
final northeast = data['bounds']['northeast'];
final southwest = data['bounds']['southwest'];
final bounds = LatLngBounds(
var northeast = data['bounds']['northeast'];
var southwest = data['bounds']['southwest'];
var bounds = LatLngBounds(
southwest: LatLng(southwest['lat'], southwest['lng']),
northeast: LatLng(northeast['lat'], northeast['lng']),
);
int distance = 0;
int duration = 0;
var distance = 0;
var duration = 0;
if ((data['legs'] as List).isNotEmpty) {
final leg = data['legs'][0];
var leg = (data['legs'] as List)[0];
distance = leg['distance']['value'];
duration = leg['duration']['value'];
}
@ -83,6 +81,11 @@ class Directions {
totalDuration: duration,
);
}
final LatLngBounds bounds;
final List<PointLatLng> polylinePoints;
final int totalDistance;
final int totalDuration;
}
class GoogleMapsException implements Exception {

View file

@ -4,13 +4,13 @@ part of google_track_trace;
enum TimePrecision { updateOnly, everySecond, everyMinute }
class GoogleTrackTraceMap extends StatefulWidget {
GoogleTrackTraceMap({
Key? key,
const GoogleTrackTraceMap({
required this.onMapCreated,
required this.startPosition,
required this.destinationPosition,
required this.googleAPIKey,
required this.routeUpdateInterval,
Key? key,
this.timerPrecision = TimePrecision.everyMinute,
this.travelMode = TravelMode.driving,
this.compassEnabled = false,
@ -22,8 +22,7 @@ class GoogleTrackTraceMap extends StatefulWidget {
this.mapMarkations =
'[{"featureType": "poi","stylers": [{"visibility": "off"}]}]',
this.line,
}) : assert(true),
super(key: key);
}) : super(key: key);
/// Callback method for when the map is ready to be used.
///
@ -40,7 +39,7 @@ class GoogleTrackTraceMap extends StatefulWidget {
final Marker startPosition;
final Marker destinationPosition;
Polyline? line;
final Polyline? line;
final bool compassEnabled;
final bool zoomControlsEnabled;
@ -51,11 +50,6 @@ class GoogleTrackTraceMap extends StatefulWidget {
final String mapMarkations;
CameraPosition initialCameraPosition = const CameraPosition(
// doetinchem default initialCamera
target: LatLng(51.965578, 6.293439),
zoom: 12.0);
final String googleAPIKey;
@override
@ -88,7 +82,7 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
Widget build(BuildContext context) {
return GoogleMap(
initialCameraPosition: calculateCameraPosition(
controller.start.position, controller.end.position),
controller.start.position, controller.end.position,),
onMapCreated: _onMapCreated,
compassEnabled: widget.compassEnabled,
zoomControlsEnabled: widget.zoomControlsEnabled,
@ -96,27 +90,27 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
mapToolbarEnabled: widget.mapToolbarEnabled,
mapType: widget.mapType,
buildingsEnabled: widget.buildingsEnabled,
markers: {
markers: <Marker>{
controller.start,
controller.end,
},
polylines: {
polylines: <Polyline>{
if (controller.route != null)
(widget.line != null)
? widget.line!.copyWith(
pointsParam: controller.route!.line
.map((e) => LatLng(e.latitude, e.longitude))
.toList())
.map((PointLatLng e) => LatLng(e.latitude, e.longitude))
.toList(),)
: Polyline(
// default PolyLine if none is provided
polylineId: const PolylineId('track&trace route'),
color: Theme.of(context).primaryColor,
width: 4,
points: controller.route!.line
.map((e) => LatLng(e.latitude, e.longitude))
.map((PointLatLng e) => LatLng(e.latitude, e.longitude))
.toList(),
),
});
},);
}
void _onChange() {
@ -131,12 +125,17 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
}
CameraPosition calculateCameraPosition(LatLng pointA, LatLng pointB) {
LatLng target = LatLng((pointA.latitude + pointB.latitude) / 2,
(pointA.longitude + pointB.longitude) / 2);
double calculatedZoom = 13.0; // TODO calculate this zoom
var target = LatLng(
(pointA.latitude + pointB.latitude) / 2,
(pointA.longitude + pointB.longitude) / 2,
);
return CameraPosition(
target: target, zoom: calculatedZoom, tilt: 0.0, bearing: 0.0);
target: target,
zoom: 13.0,
tilt: 0.0,
bearing: 0.0,
);
}
CameraUpdate moveCameraToCenter(LatLng pointA, LatLng pointB) {
@ -151,33 +150,34 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
max(pointA.longitude, pointB.longitude),
),
),
50);
50,);
}
void startRouteUpdateTimer() {
calculateRoute(); // run at the start
Timer.periodic(Duration(seconds: widget.routeUpdateInterval), (timer) {
Timer.periodic(Duration(seconds: widget.routeUpdateInterval),
(Timer timer) {
calculateRoute();
});
}
void startMarkerUpdateTimer() {
if (widget.timerPrecision != TimePrecision.updateOnly) {
int updateInterval =
var updateInterval =
(widget.timerPrecision == TimePrecision.everyMinute) ? 60 : 1;
Timer.periodic(Duration(seconds: updateInterval), (timer) {
if (controller.route != null) {
controller.route = TrackTraceRoute(
controller.route!.duration - updateInterval,
controller.route!.distance,
controller.route!.line);
controller.route!.line,);
}
});
}
}
void calculateRoute() async {
DirectionsRepository() //TODO refactor this away
void calculateRoute(){
DirectionsRepository() // TODO(freek): refactor this away
.getDirections(
origin: controller.start.position,
destination: controller.end.position,
@ -186,15 +186,15 @@ class _GoogleTrackTraceMapState extends State<GoogleTrackTraceMap> {
)
.then((value) => {
controller.route = TrackTraceRoute(value.totalDuration,
value.totalDistance, value.polylinePoints),
value.totalDistance, value.polylinePoints,),
if (controller.mapController != null)
{
controller.mapController!.moveCamera(moveCameraToCenter(
controller.start.position, controller.end.position)),
controller.start.position, controller.end.position,),),
},
setState(() {
lastRouteUpdate = DateTime.now();
})
});
},);
}
}