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(
74 visibleWidgets: widget.viewConfig.visibleWidgets & NavigineWidgetVisibility.all,
78 _locationWindow = window;
82 widget.onViewCreated(window);
87 _locationWindow?.removeCameraListener(
this);
91 void _handleFollowMePressed() {
92 if (!mounted || _userLocationLayer ==
null)
return;
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,
102 _userLocationLayer!.resetAnchor();
105 _isFollowing = !_isFollowing;
109 List<Widget> _followMeOverlays(FollowMeButtonConfig followMeConfig,
int visibleWidgets) {
110 if ((visibleWidgets & NavigationWidgetVisibility.followMeButton) == 0) {
115 isFollowing: _isFollowing,
116 onPressed: _handleFollowMePressed,
117 config: followMeConfig,
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,
134 zoomControlsConfig: widget.configController!.zoomControlsConfig,
135 floorSelectorConfig: widget.configController!.floorSelectorConfig,
136 textDirection: widget.textDirection,
137 extraOverlays: _followMeOverlays(
138 widget.configController!.followMeButtonConfig,
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,
159 void onCameraPositionChanged(CameraUpdateReason reason,
bool finished) {
160 if (reason == CameraUpdateReason.APPLICATION) {
164 if (_isFollowing && _userLocationLayer !=
null) {
165 _userLocationLayer!.resetAnchor();
167 _isFollowing =
false;