Loading...
Searching...
No Matches
default_navigation_view.dart
Go to the documentation of this file.
1import 'package:flutter/material.dart';
2import 'package:navigine_sdk/com/navigine/idl/camera_listener.dart';
3import 'package:navigine_sdk/com/navigine/idl/camera_update_reason.dart';
4import 'package:navigine_sdk/com/navigine/idl/location_window.dart';
5import 'package:navigine_sdk/com/navigine/idl/navigine_sdk.dart';
6import 'package:navigine_sdk/com/navigine/idl/user_location_layer.dart';
7import 'dart:math' as math;
8import 'default_navigine_view.dart';
9import 'default_navigine_view_config.dart';
10import 'default_navigation_view_config.dart';
11import 'widgets/zoom_controls_config.dart';
12import 'widgets/floor_selector_view_config.dart';
13import 'widgets/follow_me_button.dart';
14import 'widgets/follow_me_button_config.dart';
15
43class DefaultNavigationView extends StatefulWidget {
45 Key? key,
46 required this.onViewCreated,
48 this.zoomControlsConfig = ZoomControlsConfig.defaultConfig,
49 this.followMeButtonConfig = FollowMeButtonConfig.defaultConfig,
50 this.floorSelectorConfig = FloorSelectorViewConfig.defaultConfig,
51 this.configController,
52 this.textDirection,
53 }) : super(key: key);
54
55 final void Function(LocationWindow) onViewCreated;
56 final DefaultNavigationViewConfig viewConfig;
57 final ZoomControlsConfig zoomControlsConfig;
58 final FollowMeButtonConfig followMeButtonConfig;
59 final FloorSelectorViewConfig floorSelectorConfig;
60 final DefaultNavigationViewController? configController;
61 final TextDirection? textDirection;
62
63 @override
64 State<DefaultNavigationView> createState() => _DefaultNavigationViewState();
65}
66
67class _DefaultNavigationViewState extends State<DefaultNavigationView>
68 implements CameraListener {
70 LocationWindow? _locationWindow;
71 bool _isFollowing = false;
72
73 DefaultNavigineViewConfig get _chromeConfig => DefaultNavigineViewConfig(
74 visibleWidgets: widget.viewConfig.visibleWidgets & NavigineWidgetVisibility.all,
75 );
76
77 void _handleViewCreated(LocationWindow window) {
78 _locationWindow = window;
79 window.addCameraListener(this);
81 _userLocationLayer!.setVisible(true);
82 widget.onViewCreated(window);
83 }
84
85 @override
86 void dispose() {
87 _locationWindow?.removeCameraListener(this);
88 super.dispose();
89 }
90
91 void _handleFollowMePressed() {
92 if (!mounted || _userLocationLayer == null) return;
93
94 if (!_isFollowing) {
95 final screenSize = MediaQuery.of(context).size;
96 final devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
97 _userLocationLayer!.setAnchor(math.Point<double>(
98 screenSize.width * devicePixelRatio / 2,
99 screenSize.height * devicePixelRatio / 2,
100 ));
101 } else {
102 _userLocationLayer!.resetAnchor();
103 }
104 setState(() {
105 _isFollowing = !_isFollowing;
106 });
107 }
108
109 List<Widget> _followMeOverlays(FollowMeButtonConfig followMeConfig, int visibleWidgets) {
110 if ((visibleWidgets & NavigationWidgetVisibility.followMeButton) == 0) {
111 return const [];
112 }
113 return [
114 FollowMeButton(
115 isFollowing: _isFollowing,
116 onPressed: _handleFollowMePressed,
117 config: followMeConfig,
118 ),
119 ];
120 }
121
122 @override
123 Widget build(BuildContext context) {
124 if (widget.configController != null) {
125 return ListenableBuilder(
126 listenable: widget.configController!,
127 builder: (context, _) {
128 final vc = widget.configController!.viewConfig;
129 return DefaultNavigineView(
130 onViewCreated: _handleViewCreated,
131 viewConfig: DefaultNavigineViewConfig(
132 visibleWidgets: vc.visibleWidgets & NavigineWidgetVisibility.all,
133 ),
134 zoomControlsConfig: widget.configController!.zoomControlsConfig,
135 floorSelectorConfig: widget.configController!.floorSelectorConfig,
136 textDirection: widget.textDirection,
137 extraOverlays: _followMeOverlays(
138 widget.configController!.followMeButtonConfig,
139 vc.visibleWidgets,
140 ),
141 );
142 },
143 );
144 }
145 return DefaultNavigineView(
146 onViewCreated: _handleViewCreated,
147 viewConfig: _chromeConfig,
148 zoomControlsConfig: widget.zoomControlsConfig,
149 floorSelectorConfig: widget.floorSelectorConfig,
150 textDirection: widget.textDirection,
151 extraOverlays: _followMeOverlays(
152 widget.followMeButtonConfig,
153 widget.viewConfig.visibleWidgets,
154 ),
155 );
156 }
157
158 @override
159 void onCameraPositionChanged(CameraUpdateReason reason, bool finished) {
160 if (reason == CameraUpdateReason.APPLICATION) {
161 return;
162 }
163
164 if (_isFollowing && _userLocationLayer != null) {
165 _userLocationLayer!.resetAnchor();
166 setState(() {
167 _isFollowing = false;
168 });
169 }
170 }
171}