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';
51 this.configController,
61 final TextDirection? textDirection;
64 State<DefaultNavigationView>
createState() => _DefaultNavigationViewState();
67class _DefaultNavigationViewState
extends State<DefaultNavigationView>
71 bool _isFollowing =
false;
73 DefaultNavigineViewConfig
get _chromeConfig => DefaultNavigineViewConfig(
75 widget.viewConfig.visibleWidgets & NavigineWidgetVisibility.all,
79 _locationWindow = window;
83 widget.onViewCreated(window);
88 _locationWindow?.removeCameraListener(
this);
93 void didChangeDependencies() {
94 super.didChangeDependencies();
97 WidgetsBinding.instance.addPostFrameCallback((_) {
98 if (mounted && _isFollowing) {
99 _updateFollowMeAnchor();
105 void _handleFollowMePressed() {
106 if (!mounted || _userLocationLayer ==
null)
return;
109 _updateFollowMeAnchor();
111 _userLocationLayer!.resetAnchor();
114 _isFollowing = !_isFollowing;
118 void _updateFollowMeAnchor() {
119 if (!mounted || _userLocationLayer ==
null)
return;
121 final mediaQuery = MediaQuery.of(context);
122 final screenSize = context.size ?? mediaQuery.size;
123 final devicePixelRatio = mediaQuery.devicePixelRatio;
124 _userLocationLayer!.setAnchor(math.Point<
double>(
125 screenSize.width * devicePixelRatio / 2,
126 screenSize.height * devicePixelRatio / 2,
130 List<Widget> _followMeOverlays(
131 FollowMeButtonConfig followMeConfig,
int visibleWidgets) {
132 if ((visibleWidgets & NavigationWidgetVisibility.followMeButton) == 0) {
137 isFollowing: _isFollowing,
138 onPressed: _handleFollowMePressed,
139 config: followMeConfig,
145 Widget build(BuildContext context) {
146 if (widget.configController !=
null) {
147 return ListenableBuilder(
148 listenable: widget.configController!,
149 builder: (context, _) {
150 final vc = widget.configController!.viewConfig;
151 return DefaultNavigineView(
152 onViewCreated: _handleViewCreated,
153 viewConfig: DefaultNavigineViewConfig(
154 visibleWidgets: vc.visibleWidgets & NavigineWidgetVisibility.all,
156 zoomControlsConfig: widget.configController!.zoomControlsConfig,
157 floorSelectorConfig: widget.configController!.floorSelectorConfig,
158 textDirection: widget.textDirection,
159 extraOverlays: _followMeOverlays(
160 widget.configController!.followMeButtonConfig,
167 return DefaultNavigineView(
168 onViewCreated: _handleViewCreated,
169 viewConfig: _chromeConfig,
170 zoomControlsConfig: widget.zoomControlsConfig,
171 floorSelectorConfig: widget.floorSelectorConfig,
172 textDirection: widget.textDirection,
173 extraOverlays: _followMeOverlays(
174 widget.followMeButtonConfig,
175 widget.viewConfig.visibleWidgets,
181 void onCameraPositionChanged(CameraUpdateReason reason,
bool finished) {
182 if (reason == CameraUpdateReason.APPLICATION) {
186 if (_isFollowing && _userLocationLayer !=
null) {
187 _userLocationLayer!.resetAnchor();
189 _isFollowing =
false;