import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:geolocator/geolocator.dart';
//import 'package:provider/provider.dart';
class Map extends StatefulWidget {
@override
State<StatefulWidget> createState() => _MapState();
}
class _MapState extends State<Map> {
Completer<GoogleMapController> _controllerGoogleMap = Completer();
GoogleMapController newGoogleMapController;
Position currentPosition;
var geoLocator = Geolocator();
void locatePosition() async {
Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.best);
currentPosition = position;
LatLng latLngPos = LatLng(position.latitude, position.longitude);
CameraPosition cameraPosition =
CameraPosition(target: latLngPos, zoom: 15.0);
newGoogleMapController
.animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
}
static final CameraPosition _kGooglePlex = CameraPosition(
target: LatLng(37.42796133580664, -122.085749655962),
zoom: 14.4746,
);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: GoogleMap(
mapType: MapType.normal,
myLocationButtonEnabled: true,
initialCameraPosition: _kGooglePlex,
myLocationEnabled: true,
zoomGesturesEnabled: true,
zoomControlsEnabled: true,
onMapCreated: (GoogleMapController controller) {
_controllerGoogleMap.complete(controller);
newGoogleMapController = controller;
locatePosition();
},
),
),
);
}
}
调试终端下
Launching lib\main.dart on vivo 1906 in debug mode...
lib\main.dart:1 √ Built build\app\outputs\flutter-apk\app-debug.apk. I/flutter ( 9154):
Observatory listening on ************************************ I/flutter ( 9613):
Observatory listening on ************************************ E/flutter ( 9613): [ERROR:flutter/lib/ui/ui_dart_state.cc(199)] Unhandled Exception:
User denied permissions to access the device's location. E/flutter ( 9613):
#0 MethodChannelGeolocator._handlePlatformException package:geolocator_platform_interface/…/implementations/method_channel_geolocator.dart:199
E/flutter ( 9613): #1 MethodChannelGeolocator.getCurrentPosition package:geolocator_platform_interface/…/implementations/method_channel_geolocator.dart:
118 E/flutter ( 9613): <asynchronous suspension> E/flutter ( 9613): #2 _MapState.locatePosition package:donation_yoga/screens/maps.dart:
21 E/flutter ( 9613): <asynchronous suspension> E/flutter ( 9613):
我从未拒绝过我的许可, 即使我已启用它来获取当前位置,地图也不会显示我的位置按钮, 只显示放大和缩小按钮和地图。
使用 Flutter 2.2.1 google_maps_flutter:^2.0.6 地理定位器:^7.0.3
PS:我尝试过定位包,但它抛出了很多错误,例如 location_web not found 等,
答案 0 :(得分:0)
尝试将 forceLocationManager 子句添加到您的函数中:
void locatePosition() async {
Position position = await Geolocator.getLastKnownPosition({ bool forceAndroidLocationManager = true}
);
currentPosition = position;
LatLng latLngPos = LatLng(position.latitude, position.longitude);
CameraPosition cameraPosition =
CameraPosition(target: latLngPos, zoom: 15.0);
newGoogleMapController
.animateCamera(CameraUpdate.newCameraPosition(cameraPosition));
}
还要检查您的 android manifest 以获取位置:
<manifest ... >
<!-- To request foreground location access, declare one of these
permissions. -->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
/>
</manifest>
还要保持您想要的准确度较低,准确度充其量会造成设备的隐私混乱,因此需要额外的步骤