3

我收到此错误: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,然后进行了一些更改。做了这些:

  1. Flutter pubspec.lock 文件移除
  2. 运行扑干净
  3. 运行颤振运行

它以某种方式消除了我的软件包问题,但我在运行时仍然遇到错误。然后我就这样做了

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 -vflutter 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!

我该如何解决这个问题?

4

3 回答 3

3

只是对上一个答案进行一些更正

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,
      position.longitude,
    );
    if (places != null && places.isNotEmpty) {
      final Placemark place = places.first;
      return "${place.thoroughfare}, ${place.locality}";
    }

    return "No address available";
  }

于 2020-11-09T02:52:47.850 回答
2

这确实是Geolocator()package deprecated 的问题geolocator。现在有了新的flutter版本1.20.3geolocator 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}";
      });   

要获取地址,您现在可以同时关注地理定位器和geocoder文档。无论如何,我还是通过我的代码指出了这一点:

算法:

  1. 您从 Geolocator 获得位置
  2. 你只能forceAndroidLocationManager: trueGeolocator Position
  3. 您从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代码的方式。

于 2020-09-03T12:17:47.990 回答
2

我认为您的问题是由于从 Geolocator 版本 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";
}
于 2020-10-16T01:56:07.780 回答