Flutter Googlemap перейти к ближайшему желаемому местуAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Flutter Googlemap перейти к ближайшему желаемому месту

Сообщение Anonymous »

Итак, я делаю навигационное приложение с использованием Google Maps, и я сохранил около 20 различных мест в другом файле DART и размещал для них маркеры на карте, и я отслеживаю свое собственное местоположение, используя локальный сервер node.js в настоящее время приложение способно отслеживать мой «автомобиль» в симуляторе местоположения, что я хочу, чтобы функционировать в ближайшей кнопке, что наоборот. расположение и рисует полилинии.
ps. Кроме того, позиционированная функция в кнопке «Станции» в кнопке «В плавающем действии» не функционирует в функции OnPressed () {}, но когда я ставлю ее за пределами ее под GoogleMap (), она работает нормально, но я не хочу, чтобы это было навсегда, если у кого -то есть решение для этого, я бы вечно благодарю. Это весь код экрана основной карты, он довольно большой, но я хотел включить все. < /P>
class MapScreen extends StatefulWidget {
const MapScreen({super.key});

@override
State createState() => _MapScreenState();
}

class _MapScreenState extends State {
final Completer _controller =
Completer();

static const CameraPosition _kGooglePlex = CameraPosition(
target: LatLng(30.0076964, 31.2428155),
zoom: 12,
);

late LatLng currentPosition;
late PageController _pageController;
final Map usersCarArr = {};
List stationMarkers = [];
late BitmapDescriptor iconCar, iconStation;

@override
void initState() {
super.initState();
getIcon();
currentPosition = LatLng(
LocationManager.shared.currentPos?.latitude ?? 0.0,
LocationManager.shared.currentPos?.longitude ?? 0.0,
);
DefaultAssetBundle.of(
context,
).loadString('assets/theme/dark_theme.json').then((thisValue) {
_themeformap = thisValue;
});
SocketManager.shared.socket?.on(SVKey.nvCarJoin, (data) {
if (data[KKey.status] == "1") {
updateOtherCarLocation(data[KKey.payload] as Map? ?? {});
} else {}
});

SocketManager.shared.socket?.on(SVKey.nvCarUpdateLocation, (data) {
if (data[KKey.status] == "1") {
updateOtherCarLocation(data[KKey.payload] as Map? ?? {});
} else {}
});
apiCarJoin();
}

String _themeformap = '';

void setMarkers() {
for (var element in evStations) {
stationMarkers.add(
Marker(
markerId: MarkerId(element.stationName),
draggable: false,
infoWindow: InfoWindow(
title: element.stationName,
snippet: element.address,
),
position: element.locationCoords,
icon: iconStation,
),
);
_pageController = PageController(initialPage: 1, viewportFraction: 0.8);
}
}

AnimatedBuilder _evStationList(index) {
return AnimatedBuilder(
animation: _pageController,
builder: (BuildContext context, Widget? widget) {
double value = 1;
if (_pageController.position.haveDimensions) {
value = (_pageController.page! - index);
value = (1 - (value.abs() * 0.3) + 0.06).clamp(0.0, 1.0);
}
return Center(
child: SizedBox(
height: Curves.easeInOut.transform(value) * 132.0,
width: Curves.easeInOut.transform(value) * 350.0,
child: widget,
),
);
},
child: InkWell(
onTap: () {
moveCamera();
},
child: Stack(
children: [
Center(
child: Container(
margin: EdgeInsets.symmetric(horizontal: 10.0, vertical: 20.0),
height: 132.0,
width: 275.0,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
boxShadow: [
BoxShadow(
color: Colors.black54,
offset: Offset(0.0, 4.0),
blurRadius: 10.0,
),
],
),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10.0),
color: Colors.greenAccent.shade700,
),
child: Row(
children: [
Container(
height: 90,
width: 90,
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(10),
topLeft: Radius.circular(10),
),
image: DecorationImage(
image: AssetImage(evStations[index].thumbNail),
fit: BoxFit.cover,
),
),
),
SizedBox(width: 5),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
evStations[index].stationName,
style: TextStyle(
fontSize: 12.5,
fontWeight: FontWeight.bold,
),
),
Text(
evStations[index].address,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
),
),
],
),
),
],
),
),
),
),
],
),
),
);
}

@override
Widget build(BuildContext context) {
setMarkers();
final Set allMarkers = {
...Set.from(stationMarkers),
...usersCarArr.values,
};
return Scaffold(
backgroundColor: Colors.black87,
appBar: AppBar(
title: Text('Station Locator'),
centerTitle: true,
backgroundColor: Colors.greenAccent.shade700,
),
body: Stack(
children: [
Container(
height: MediaQuery.of(context).size.height + 50,
width: MediaQuery.of(context).size.width,
child: GoogleMap(
style: _themeformap,
mapType: MapType.normal,
initialCameraPosition: _kGooglePlex,
onMapCreated: (GoogleMapController controller) {
_controller.complete(controller);
},
markers: allMarkers,
//usersCarArr.values.toSet(),
),
),
],
),
floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
floatingActionButton: SpeedDial(
animatedIcon: AnimatedIcons.menu_close,
backgroundColor: Colors.greenAccent.shade700,
overlayColor: Colors.black87,
overlayOpacity: 0.4,
children: [
SpeedDialChild(
child: Icon(Icons.my_location),
label: 'My Location',
onTap: () {},
backgroundColor: Colors.greenAccent.shade700,
),
SpeedDialChild(
child: Icon(Icons.ev_station),
label: 'Stations',
onTap: () {
Positioned(
bottom: 20.0,
child: SizedBox(
height: 200,
width: MediaQuery.of(context).size.width,
child: PageView.builder(
controller: _pageController,
itemCount: evStations.length,
itemBuilder: (BuildContext context, int index) {
return _evStationList(index);
},
),
),
);
},
backgroundColor: Colors.greenAccent.shade700,
),
SpeedDialChild(
child: Icon(Icons.navigation),
label: 'Navigate',
onTap: () {

},
backgroundColor: Colors.greenAccent.shade700,
),
SpeedDialChild(
child: Icon(Icons.settings),
label: 'Settings',
onTap: () {},
backgroundColor: Colors.greenAccent.shade700,
),
],
),
);
}

Future _myLocation() async {
final GoogleMapController controller = await _controller.future;
await controller.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(target: currentPosition, zoom: 15),
),
);
}

void moveCamera() async {
final GoogleMapController controller = await _controller.future;
await controller.animateCamera(
CameraUpdate.newCameraPosition(
CameraPosition(
target: evStations[_pageController.page!.toInt()].locationCoords,
zoom: 14,
),
),
);
}

void getIcon() async {
var iconCar = await BitmapDescriptor.asset(
const ImageConfiguration(devicePixelRatio: 3.2),
"assets/mapicons/car.png",
width: 40,
height: 40,
);
var iconStation = await BitmapDescriptor.asset(
const ImageConfiguration(devicePixelRatio: 3.2),
"assets/mapicons/charging-station.png",
width: 40,
height: 40,
);
setState(() {
this.iconCar = iconCar;
this.iconStation = iconStation;
});
}

void updateOtherCarLocation(Map obj) {
usersCarArr[obj["uuid"].toString()] = Marker(
markerId: MarkerId(obj["uuid"].toString()),
position: LatLng(
double.tryParse(obj["lat"].toString()) ?? 0.0,
double.tryParse(obj["long"].toString()) ?? 0.0,
),
icon: iconCar,
rotation: double.tryParse(obj["degree"].toString()) ?? 0.0,
anchor: const Offset(0.5, 0.5),
);

if (mounted) {
setState(() {});
}
}

void apiCarJoin() {
ServiceCall.post(
{
"uuid": ServiceCall.userUUID,
"lat": currentPosition.latitude.toString(),
"long": currentPosition.longitude.toString(),
"degree": LocationManager.shared.carDegree.toString(),
"socket_id": SocketManager.shared.socket?.id ?? "",
},
SVKey.svCarJoin,
(responseObj) async {
if (responseObj[KKey.status] == "1") {
(responseObj[KKey.payload] as Map? ?? {}).forEach((key, value) {
usersCarArr[key.toString()] = Marker(
markerId: MarkerId(key.toString()),
position: LatLng(
double.tryParse(value["lat"].toString()) ?? 0.0,
double.tryParse(value["long"].toString()) ?? 0.0,
),
icon: iconCar,
rotation: double.tryParse(value["degree"].toString()) ?? 0.0,
anchor: const Offset(0.5, 0.5),
);
});

if (mounted) {
setState(() {});
}
} else {
debugPrint(responseObj[KKey.message] as String? ?? MSG.fail);
}
},
(error) async {
debugPrint(error.toString());
},
);
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... sired-spot
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как я могу перейти к определенному месту на странице с результатом поиска, используя QPdFSearchModel
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как привязать элемент пути к ближайшему пути Нурбса на холсте WPF?
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как привязать элемент пути к ближайшему пути Нурбса на холсте WPF?
    Anonymous » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • MySQL Заказ результатов по ближайшему номеру до заданного номера
    Anonymous » » в форуме Php
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • MySQL заказ по ближайшему матчу от частичных матчей
    Anonymous » » в форуме Php
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»