Делаю приложение с гугл картами, в котором можно найти место и построить к нему путь на карте. Я хочу показать места и адреса под ним в соответствии с тем, что вводит пользователь. После отображения результатов мне нужно получить его широту и долготу, чтобы отметить их на карте.
Я пытался использовать flutter_google_places: 0.2.3, но функции (GoogleMapsPlaces, Prediction) не были определены. Затем я использовал flutter_google_places_autocomplete: 0.1.3, и все было хорошо. К сожалению, когда я пытаюсь запустить проект, я получаю сообщение об ошибке:
Compiler message: file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/flutter_google_places_autocomplete-0.1.3/lib/src/flutter_google_places_autocomplete.dart:337:35: Error: Too many positional arguments: 0 allowed, but 1 found. Try removing the extra positional arguments. _places = new GoogleMapsPlaces(widget.apiKey); ^ file:///C:/Users/admin/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/google_maps_webservice-0.0.14/lib/src/places.dart:22:3: Context: Found this candidate, but the arguments don't match.
GoogleMapsPlaces({ ^ Compiler failed on C:\Users\admin\AndroidStudioProjects\advertise_me\lib\main.dartFAILURE: Build failed with an exception.
Where: Script 'C:\Users\admin\flutter\packages\flutter_tools\gradle\flutter.gradle' line: 647
What went wrong: Execution failed for task ':app:compileflutterBuildDebugandroid-arm64'.
Process 'command 'C:\Users\admin\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 9s Finished with error: Gradle task assembleDebug failed with exit code 1
Мой pubspes.yaml:
dependencies: flutter: sdk: flutter
cupertino_icons: ^0.1.2 url_launcher: ^4.2.0+1
google_maps_flutter: bottom_sheet_stateful: ^0.1.1
flutter_google_places_autocomplete: 0.1.3 geocoder: 0.1.2
google_maps_webservice: 0.0.14
Мой код:
import 'package:flutter/material.dart';
import 'package:advertise_me/login_screen.dart';
import 'dart:async';
import 'package:google_maps_webservice/geocoding.dart';
//import 'package:flutter_google_places/flutter_google_places.dart';
import 'package:flutter_google_places_autocomplete/flutter_google_places_autocomplete.dart';
import 'package:geocoder/geocoder.dart';
void main() => runApp(MyApp());
const kGoogleApiKey = "My key";
GoogleMapsPlaces _places = GoogleMapsPlaces(apiKey: kGoogleApiKey);
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: demo(),
),
);
}
}
class demo extends StatefulWidget {
@override
demoState createState() => new demoState();
}
class demoState extends State<demo> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
alignment: Alignment.center,
child: RaisedButton(
onPressed: () async {
Prediction p = await showGooglePlacesAutocomplete(
context: context, apiKey: kGoogleApiKey);
displayPrediction(p);
},
child: Text('Find address'),
)
)
);
}
Future<Null> displayPrediction(Prediction p) async {
if (p != null) {
PlacesDetailsResponse detail =
await _places.getDetailsByPlaceId(p.placeId);
var placeId = p.placeId;
double lat = detail.result.geometry.location.lat;
double lng = detail.result.geometry.location.lng;
var address = await Geocoder.local.findAddressesFromQuery(p.description);
print(lat);
print(lng);
}
}
}
Как исправить эту ошибку? Любая помощь горячо приветствуется.





flutter_google_places_autocomplete устарел, вместо него следует использовать flutter_google_places. См. документацию: https://pub.dev/packages/flutter_google_places_autocomplete
И как только вы используете flutter_google_places, используйте
Prediction p = await PlacesAutoComplete.show() вместо showGooglePlacesAutoComplete()
======= обновленный ответ =====
import 'package:flutter/material.dart';
//import 'package:advertise_me/login_screen.dart';
import 'dart:async';
import 'package:flutter_google_places/flutter_google_places.dart';
import 'package:geocoder/geocoder.dart';
import 'package:google_maps_webservice/places.dart';
void main() => runApp(MyApp());
const kGoogleApiKey = "My key";
GoogleMapsPlaces _places = GoogleMapsPlaces(apiKey: kGoogleApiKey);
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: demo(),
),
);
}
}
class demo extends StatefulWidget {
@override
demoState createState() => new demoState();
}
class demoState extends State<demo> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
alignment: Alignment.center,
child: RaisedButton(
onPressed: () async {
Prediction p = await PlacesAutocomplete.show(
context: context, apiKey: kGoogleApiKey);
displayPrediction(p);
},
child: Text('Find address'),
)
)
);
}
Future<Null> displayPrediction(Prediction p) async {
if (p != null) {
PlacesDetailsResponse detail =
await _places.getDetailsByPlaceId(p.placeId);
var placeId = p.placeId;
double lat = detail.result.geometry.location.lat;
double lng = detail.result.geometry.location.lng;
var address = await Geocoder.local.findAddressesFromQuery(p.description);
print(lat);
print(lng);
}
}
}
Это потому, что в вашем коде отсутствовал правильный импорт. Чтобы использовать GoogleMapsPlaces, Prediction и PlacesDetailsResponse, вам необходимо импортировать package:google_maps_webservice/places.dart. Я обновил свой ответ рабочим кодом. Это должно решить проблемы, с которыми вы сталкиваетесь.
Спасибо, я понял, что мне нужно импортировать: google_maps_webservice/places. Не могли бы вы сказать мне, почему необработанное исключение: NoSuchMethodError: геттер «геометрия» был вызван при нулевом значении. Я думаю, что это Prediction p = null, но почему это происходит? Я выбрал место или я что-то не так делаю? Если это правда, как я могу получить местоположение места, на которое нажал пользователь?
Это может быть связано с тем, что API Google настроен для вашего проекта. Проверьте, включен ли он и работает ли он должным образом в отношении ключа API. См. сообщение об этой проблеме с плагином: github.com/fluttercommunity/flutter_google_places/issues/51.
Кроме того, я думаю, что ваша первоначальная проблема была решена, для которой вы сначала разместили свой вопрос. Если это так, вы можете принять мой ответ, чтобы другие тоже знали :-)
@Darshan Не могли бы вы сказать мне, какая служба в облаке Google должна быть включена, чтобы API службы GoogleMapsPlace получал остальные ответы API?
используйте импорт 'package:google_maps_webservice/places.dart'; вместе с импортом 'package:flutter_google_places/flutter_google_places.dart';
Используйте полный список параметров функции, например:
Prediction p = await PlacesAutocomplete.show( offset: 0, radius: 1000, types: [], strictbounds: false,
region: "ar", context: context, apiKey: googleAPIKey, mode: Mode.overlay, language: "es", components: [Component(Component.country, "ar")] );
Спасибо за ответ. Я очень невнимателен. Однако после импорта flutter_google_places: 0.2.3 возникли ошибки (неопределенный класс «GoogleMapsPlaces». Функция «GoogleMapsPlaces» не определена. Неопределенный класс «Прогноз». Неопределенный класс «Прогноз». Неопределенный класс «PlacesDetailsResponse».). Можете ли вы помочь мне с этими проблемами или я должен задать это в другом вопросе?