Reputation: 8978
I am getting this error: Type 'Geolocator' not found
and 'Placemark' isn't a type
. Whenever I try to do flutter run
, I get this error:
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
Why I ran into this problem, that, I am still figuring out.
How it started?
Before I did the flutter upgrade
. While processing my electricity went, and this process got interrupted, due to this, flutter got corrupted.
What I did then?
I re-installed the Flutter, and then made some changes. Did these:
It somehow removed my packages issue, but still I was getting the errors while running. Then I did that
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
Again the same error, which I have mentioned above.
Now, what I am stipulating is, there are some sort of package deprecation problems, but I am already using the latest package that is geolocator 6.0.0+1
Show me flutter doctor -v
or flutter doctor
Here you go
[√] 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!
How can I sort this out?
Upvotes: 3
Views: 8823
Reputation: 1576
Just to put some corrections on the previous answer
pubspec.yaml with
geolocator: ^6.1.5
geocoding: 1.0.5
And this on code
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";
}
Upvotes: 4
Reputation: 1128
I think your problem is due to the fact that from Geolocator version 6.0.0rc.1 they separated Geocoding to a different plugin. If you import Geolocator together with Geocoding you can use "placemarkFromCoordinates" and Placemark, so your code would work correctly. I add an example of what the code would look like:
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";
}
Upvotes: 2
Reputation: 8978
It was indeed a problem of the deprecated Geolocator()
from the package geolocator
. Now with the new flutter version 1.20.3
and geolocator 6.0.0+1
, you need to use the package geocoder 0.2.1 to get the address.
Below code is fully deprecated and not supported at all:
// 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}";
});
To get the address you may now follow both geolocator and geocoder
documentation. I am anyway pointing it out via my code:
Algo:
forceAndroidLocationManager: true
, from Geolocator Position
onlyGeocoder
packageCode:
// 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
And this is how you fix the deprecated Geolocator
code.
Upvotes: 2