问题描述
我收到此错误:Type 'Geolocator' not found
和'Placemark' isn't a type
。每当我尝试执行flutter run
时,都会出现此错误:
lib/screens/register.dart:33:9: Error: Type 'Geolocator' not found.
final Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
^^^^^^^^^^
lib/screens/profile_edit.dart:33:9: Error: Type 'Geolocator' not found.
final Geolocator _geolocator = Geolocator()..forceAndroidLocationManager;
^^^^^^^^^^
lib/screens/register.dart:33:9: Error: 'Geolocator' isn't a type.
final Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
^^^^^^^^^^
lib/screens/register.dart:33:33: Error: Method not found: 'Geolocator'.
final Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
^^^^^^^^^^
lib/screens/register.dart:108:12: Error: 'Placemark' isn't a type.
List<Placemark> p = await geolocator.placemarkFromCoordinates(
^^^^^^^^^
lib/screens/register.dart:111:7: Error: 'Placemark' isn't a type.
Placemark place = p[0];
^^^^^^^^^
lib/screens/profile_edit.dart:33:9: Error: 'Geolocator' isn't a type.
final Geolocator _geolocator = Geolocator()..forceAndroidLocationManager;
^^^^^^^^^^
lib/screens/profile_edit.dart:33:34: Error: Method not found: 'Geolocator'.
final Geolocator _geolocator = Geolocator()..forceAndroidLocationManager;
^^^^^^^^^^
lib/screens/profile_edit.dart:70:12: Error: 'Placemark' isn't a type.
List<Placemark> p = await _geolocator.placemarkFromCoordinates(
^^^^^^^^^
lib/screens/profile_edit.dart:73:7: Error: 'Placemark' isn't a type.
Placemark place = p[0];
^^^^^^^^^
FAILURE: Build failed with an exception.
* Where:
Script 'C:\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 896
* What went wrong:
Execution failed for task ':app:compileFlutterBuildDebug'.
> Process 'command 'C:\flutter\bin\flutter.bat'' finished with non-zero exit value 1
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 24s
Running Gradle task 'assembleDebug'...
Running Gradle task 'assembleDebug'... Done 25.3s
Exception: Gradle task assembleDebug failed with exit code 1
为什么我遇到这个问题,我仍然在解决。
它是如何开始的?
在我进行flutter upgrade
之前。在处理我的电力的过程中,由于这个原因,这个过程被中断了,颤动被破坏了。
那我做了什么?
我重新安装了Flutter,然后进行了一些更改。这些吗?
- 清除pubspec.lock文件
- 运行平稳干净
- 扑扑奔跑
它以某种方式消除了我的软件包问题,但在运行时仍然出现错误。然后我做到了
flutter upgrade --force // which gave me that I am on stable and upgraded
flutter pub cache repair // which downloaded the packages again,except few failures which I ignored,not related to geolocator
flutter clean
flutter run
再次遇到我上面提到的相同错误。
现在,我所规定的是,存在某种软件包过时的问题,但是我已经在使用最新的软件包geolocator 6.0.0+1
向我显示flutter doctor -v
或flutter doctor
你在这里
[√] Flutter (Channel stable,1.20.3,on Microsoft Windows [Version 10.0.18363.1016],locale en-US)
• Flutter version 1.20.3 at C:\flutter
• Framework revision 216dee60c0 (2 days ago),2020-09-01 12:24:47 -0700
• Engine revision d1bc06f032
• Dart version 2.9.2
[√] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
• Android SDK at C:\Users\ALOKKU~1\AppData\Local\Android\Sdk
• Platform android-29,build-tools 29.0.2
• ANDROID_HOME = C:\Users\ALOKKU~1\AppData\Local\Android\Sdk
• ANDROID_SDK_ROOT = C:\Users\ALOKKU~1\AppData\Local\Android\Sdk
• Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
• Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b04)
• All Android licenses accepted.
[√] Android Studio (version 3.6)
• Android Studio at C:\Program Files\Android\Android Studio
• Flutter plugin version 44.0.2
• Dart plugin version 192.7761
• Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b04)
[√] VS Code (version 1.48.2)
• VS Code at C:\Users\ALOK KUMAR\AppData\Local\Programs\Microsoft VS Code
• Flutter extension version 3.13.2
[√] Connected device (1 available)
• ONEPLUS A6010 (mobile) • 4ee3072b • android-arm64 • Android 10 (API 29)
• No issues found!
我该如何解决呢?
解决方法
这确实是软件包Geolocator()
中弃用的geolocator
的问题。现在,使用新的Flutter版本1.20.3
和geolocator 6.0.0+1
,您需要使用软件包geocoder 0.2.1来获取地址。
以下代码已被完全弃用,完全不受支持:
// for getting the position
final Geolocator geolocator = Geolocator()..forceAndroidLocationManager;
geolocator
.getCurrentPosition(desiredAccuracy: LocationAccuracy.best)
.then((Position position) {
setState(() {
_currentPosition = position;
});
}).catchError((e) {
print(e);
});
// for getting location address
List<Placemark> p = await geolocator.placemarkFromCoordinates(
_currentPosition.latitude,_currentPosition.longitude);
Placemark place = p[0];
setState(() {
_currentAddress =
"${place.locality},${place.postalCode},${place.country}";
});
要获取地址,您现在可以同时阅读geolocator和geocoder
文档。无论如何,我通过我的代码指出了这一点:
算法:
- 您从Geolocator获得职位
- 您只能从
forceAndroidLocationManager: true
开始Geolocator Position
- 您从
Geocoder
包裹中获取地址
代码:
// you can play with the accuracy as per your need. best,high,low etc
// by default forceAndroidLocationManager is false
Position position = await getCurrentPosition(desiredAccuracy: LocationAccuracy.high,forceAndroidLocationManager: true).catchError((err) => print(err));
// this will get the coordinates from the lat-long using Geocoder Coordinates
final coordinates = Coordinates(position.latitude,position.longitude);
// this fetches multiple address,but you need to get the first address by doing the following two codes
var addresses = await Geocoder.local.findAddressesFromCoordinates(coordinates);
var first = addresses.first;
print(place.countryName); // your country name will come. You can play with it to find out more
这就是您修复不推荐使用的Geolocator
代码的方法。
我认为您的问题是由于from Geolocator version 6.0.0rc.1他们将地址解析分离到了另一个插件造成的。 如果将Geolocator和Geocoding一起导入,则可以使用“ placemarkFromCoordinates”和Placemark,这样您的代码即可正常工作。 我添加了一个代码示例:
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
...
// Future builder with GoogleMap widget or whatever...
...
// Method to get current position:
Future<void> _getCurrentPosition() async {
// verify permissions
LocationPermission permission = await checkPermission();
if (permission == LocationPermission.denied ||
permission == LocationPermission.deniedForever) {
permission = await requestPermission();
}
// get current position
_currentPosition =
await getCurrentPosition(desiredAccuracy: LocationAccuracy.high);
// get address
String _currentAddress = await _getGeolocationAddress(_currentPosition);
}
// Method to get Address from position:
Future<String> _getGeolocationAddress(Position position) async {
// geocoding
var places = await placemarkFromCoordinates(
position.latitude,position.longitude,);
if (places != null && places.isNotEmpty) {
final Placemark place = places.first;
return "${place.thoroughfare},${place.locality}";
}
return "No address availabe";
}
,
只需对先前的答案进行一些修正
pubspec.yaml与
geolocator: ^6.1.5
geocoding: 1.0.5
这在代码上
import 'package:geocoding/geocoding.dart';
import 'package:geolocator/geolocator.dart';
Future<void> _getCurrentPosition() async {
// verify permissions
LocationPermission permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied ||
permission == LocationPermission.deniedForever) {
await Geolocator.openAppSettings();
await Geolocator.openLocationSettings();
}
// get current position
_currentPosition = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high);
// get address
String _currentAddress = await _getGeolocationAddress(_currentPosition);
}
// Method to get Address from position:
Future<String> _getGeolocationAddress(Position position) async {
// geocoding
var places = await placemarkFromCoordinates(
position.latitude,);
if (places != null && places.isNotEmpty) {
final Placemark place = places.first;
return "${place.thoroughfare},${place.locality}";
}
return "No address available";
}