9class AsyncRouteManagerExample {
11 LocationManager? _locationManager;
12 NavigationManager? _navigationManager;
13 AsyncRouteManager? _asyncRouteManager;
14 AsyncRouteListener? _asyncRouteListener;
15 RouteSession? _currentSession;
17 AsyncRouteManagerExample() {
19 _setupAsyncRouteListener();
25 void _initializeSdk() {
29 _sdk = NavigineSdk.getInstance();
34 _sdk?.setUserHash(
"USER-HASH-HERE");
39 _sdk?.setServer(
"https://custom.navigine.com");
44 _locationManager = _sdk?.getLocationManager();
49 _navigationManager = _sdk?.getNavigationManager(_locationManager!);
54 _asyncRouteManager = _sdk?.getAsyncRouteManager(
60 if (_locationManager !=
null &&
61 _navigationManager !=
null &&
62 _asyncRouteManager !=
null) {
64 "LocationManager, NavigationManager and AsyncRouteManager successfully initialized",
68 print(
"Error initializing SDK: $e");
75 void _setupAsyncRouteListener() {
76 _asyncRouteListener = AsyncRouteListener(
78 onRouteChanged: (RouteStatus status, RoutePath currentPath) {
79 print(
"Route changed with status: $status");
80 if (status == RouteStatus.newRoute && currentPath !=
null) {
81 _demonstrateRoutePathUsage(currentPath);
83 print(
"Route not ready, status: $status");
89 onRouteAdvanced: (
double distance, LocationPoint point) {
90 print(
"Route advanced: $distance meters");
91 _demonstrateLocationPointUsage(point);
100 void demonstrateAsyncRouteManagerMethods() {
101 if (_asyncRouteManager ==
null) {
102 print(
"AsyncRouteManager not initialized");
107 Point destinationPoint = Point(x: 100.0, y: 100.0);
108 LocationPoint destinationLocationPoint = LocationPoint(
109 point: destinationPoint,
115 RouteOptions routeOptions = RouteOptions(2.0, 5.0, 2.0);
119 RouteSession session = _asyncRouteManager!.createRouteSession(
120 destinationLocationPoint,
123 print(
"Created route session with default graph tag");
128 RouteSession sessionWithTag = _asyncRouteManager!.createRouteSessionWithTag(
129 destinationLocationPoint,
133 print(
"Created route session with 'main' graph tag");
137 _currentSession = session;
140 if (_asyncRouteListener !=
null) {
143 session.addRouteListener(_asyncRouteListener!);
151 void _demonstrateRoutePathUsage(RoutePath routePath) {
152 if (routePath ==
null) {
153 print(
"RoutePath is null");
159 double length = routePath.length;
160 print(
"Route length: $length meters");
165 List<LocationPoint> points = routePath.points;
166 print(
"Number of route points: ${points.length}");
167 for (
int i = 0; i < points.length && i < 3; i++) {
168 print(
"Point ${i + 1}: ${points[i]}");
174 List<RouteEvent> events = routePath.events;
175 print(
"Number of route events: ${events.length}");
176 for (
int i = 0; i < events.length && i < 3; i++) {
177 _demonstrateRouteEventUsage(events[i]);
183 RoutePath head = routePath.head(10.0);
185 print(
"Route head length: ${head.length} meters");
191 RoutePath tail = routePath.tail(10.0);
193 print(
"Route tail length: ${tail.length} meters");
201 void _demonstrateRouteEventUsage(RouteEvent event) {
203 print(
"RouteEvent is null");
209 RouteEventType type =
event.type;
210 print(
"Event type: $type");
215 int value =
event.value;
216 print(
"Event value: $value");
221 double distance =
event.distance;
222 print(
"Event distance: $distance meters");
227 RouteEvent newEvent = RouteEvent(RouteEventType.TURN_LEFT, 90, 50.0);
229 "Created new route event: ${newEvent.type} at ${newEvent.distance} meters",
237 void demonstrateRouteEventTypes() {
240 print(
"Available route event types:");
241 print(
" - RouteEventType.TURN_LEFT: ${RouteEventType.TURN_LEFT}");
242 print(
" - RouteEventType.TURN_RIGHT: ${RouteEventType.TURN_RIGHT}");
243 print(
" - RouteEventType.TRANSITION: ${RouteEventType.TRANSITION}");
250 void _demonstrateLocationPointUsage(LocationPoint locationPoint) {
251 if (locationPoint ==
null) {
252 print(
"LocationPoint is null");
258 Point point = locationPoint.point;
259 print(
"Location point: (${point.x}, ${point.y})");
264 int locationId = locationPoint.locationId;
265 print(
"Location ID: $locationId");
270 int sublocationId = locationPoint.sublocationId;
271 print(
"Sublocation ID: $sublocationId");
276 Point newPoint = Point(x: 25.0, y: 35.0);
277 LocationPoint newLocationPoint = LocationPoint(
283 "Created new location point: ${newLocationPoint.point.x}, ${newLocationPoint.point.y}",
291 void _demonstratePointUsage(Point point) {
293 print(
"Point is null");
300 print(
"Point X: $x");
306 print(
"Point Y: $y");
311 Point newPoint = Point(x: 15.0, y: 25.0);
312 print(
"Created new point: (${newPoint.x}, ${newPoint.y})");
319 void demonstrateRouteOptions() {
320 print(
"=== Route Options ===");
324 RouteOptions routeOptions = RouteOptions(3.0, 7.0, 2.5);
326 "Created route options with smoothRadius: ${routeOptions.smoothRadius}, maxProjectionDistance: ${routeOptions.maxProjectionDistance}, maxAdvance: ${routeOptions.maxAdvance}",
331 List<RouteOptions> optionsList = [
332 RouteOptions(0.0, 5.0, 2.0),
333 RouteOptions(2.0, 10.0, 1.0),
334 RouteOptions(1.0, 3.0, 3.0),
337 for (
int i = 0; i < optionsList.length; i++) {
338 RouteOptions options = optionsList[i];
340 "Options ${i + 1}: smoothRadius=${options.smoothRadius}, maxProjectionDistance=${options.maxProjectionDistance}, maxAdvance=${options.maxAdvance}",
348 Future<void> demonstrateAdvancedAsyncRoutingFeatures() async {
349 print(
"=== Advanced Async Routing Features ===");
351 if (_asyncRouteManager ==
null) {
356 List<LocationPoint> destinations = [
358 point: Point(x: 50.0, y: 50.0),
363 point: Point(x: 100.0, y: 100.0),
368 point: Point(x: 150.0, y: 150.0),
375 List<RouteOptions> optionsList = [
376 RouteOptions(2.0, 5.0, 2.0),
377 RouteOptions(3.0, 7.0, 1.5),
378 RouteOptions(1.0, 3.0, 2.5),
382 List<RouteSession> sessions = [];
383 for (
int i = 0; i < destinations.length; i++) {
384 RouteSession session = _asyncRouteManager!.createRouteSession(
388 sessions.add(session);
390 "Created session ${i + 1} for destination: ${destinations[i].point.x}, ${destinations[i].point.y}",
393 if (_asyncRouteListener !=
null) {
394 session.addRouteListener(_asyncRouteListener!);
397 await Future.delayed(Duration(seconds: 1));
401 await Future.delayed(Duration(seconds: 3));
404 for (
int i = 0; i < sessions.length; i++) {
407 _asyncRouteManager!.cancelRouteSession(sessions[i]);
408 print(
"Cancelled session ${i + 1}");
411 await Future.delayed(Duration(seconds: 1));
418 void demonstrateRouteStatusUsage() {
419 print(
"=== RouteStatus Enum Usage ===");
423 print(
"Available RouteStatus values:");
424 List<RouteStatus> allStatuses = [
425 RouteStatus.missingGraph,
426 RouteStatus.missingPosition,
427 RouteStatus.missingRoute,
428 RouteStatus.missingProjection,
429 RouteStatus.newRoute,
431 for (RouteStatus status in allStatuses) {
432 print(
" - $status: ${status.toString()}");
436 RouteStatus testStatus = RouteStatus.newRoute;
437 switch (testStatus) {
438 case RouteStatus.newRoute:
439 print(
"Router is ready for navigation");
441 case RouteStatus.missingGraph:
442 print(
"Router is missing the route graph");
444 case RouteStatus.missingPosition:
445 print(
"Router is missing the current position");
447 case RouteStatus.missingProjection:
448 print(
"Current position is off the route graph");
450 case RouteStatus.missingRoute:
451 print(
"Router unable to find the route to the destination point");
460 void demonstrateRouteSessionManagement() {
461 print(
"=== Route Session Management ===");
463 if (_asyncRouteManager ==
null || _asyncRouteListener ==
null) {
468 Point destinationPoint = Point(x: 75.0, y: 75.0);
469 LocationPoint destinationLocationPoint = LocationPoint(
470 point: destinationPoint,
474 RouteOptions routeOptions = RouteOptions(2.0, 5.0, 2.0);
477 RouteSession defaultSession = _asyncRouteManager!.createRouteSession(
478 destinationLocationPoint,
481 print(
"Created session with default tag");
484 RouteSession taggedSession = _asyncRouteManager!.createRouteSessionWithTag(
485 destinationLocationPoint,
489 print(
"Created session with 'elevator' tag");
492 defaultSession.addRouteListener(_asyncRouteListener!);
493 taggedSession.addRouteListener(_asyncRouteListener!);
496 Future.delayed(Duration(seconds: 2), () {
500 defaultSession.removeRouteListener(_asyncRouteListener!);
501 taggedSession.removeRouteListener(_asyncRouteListener!);
502 print(
"Removed listeners from sessions");
506 _asyncRouteManager!.cancelRouteSession(defaultSession);
507 _asyncRouteManager!.cancelRouteSession(taggedSession);
508 print(
"Cancelled both sessions");
516 if (_currentSession !=
null && _asyncRouteListener !=
null) {
519 _currentSession!.removeRouteListener(_asyncRouteListener!);
523 if (_asyncRouteManager !=
null && _currentSession !=
null) {
526 _asyncRouteManager!.cancelRouteSession(_currentSession!);
534 Future<void> runExample() async {
535 print(
"=== AsyncRouteManager Example ===");
537 demonstrateAsyncRouteManagerMethods();
538 demonstrateRouteEventTypes();
539 demonstrateRouteOptions();
540 demonstrateRouteStatusUsage();
541 demonstrateRouteSessionManagement();
542 await demonstrateAdvancedAsyncRoutingFeatures();
545 await Future.delayed(Duration(seconds: 3));
548 print(
"=== Example completed ===");