Anonymous
Ошибка сборки: пространство имен не указано для пакета местоположения в проекте Flutter
Сообщение
Anonymous » 12 ноя 2024, 22:08
После входа в систему home_page.dart
Каждый раз, когда я запускаю это приложение, у меня возникает ошибка. Переменная humanReadableAddress (используемая для форматированного адреса в API Карт Google через геокодер) корректно выводится в журнал. Я проверил это, используя print("humanReadableAddress = " + humanReadableAddress);. Однако когда я пытаюсь использовать humanReadableAddress для автоматического заполнения текстового поля адреса получения в search_destination_pages.dart, появляется экран ошибки с красным и желтым текстом (как показано на снимке экрана). ошибка красного и желтого текста
Если я удалю следующие строки из search_destination_pages.dart:
Код: Выделить всё
String userAddress = Provider.of(context, listen: false) .pickUpLocation! .humanReadableAddress ?? ""; pickUpTextEditingController.text = userAddress;
тогда сообщение об ошибке больше не появляется. После удаления вышеуказанных строк из search_destination_pages.dart Однако поле адреса получения не заполняется автоматически текущим местоположением (хранящимся в humanReadableAddress). Эта проблема мешает корректной работе humanReadableAddress в моем проекте.
Вот страницы проекта flutter
SearchDestinationPage.dart
Код: Выделить всё
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:users_app/global/global_var.dart';
import 'package:users_app/methods/common_methods.dart';
import 'package:users_app/models/prediction_model.dart';
import 'package:users_app/widgets/prediction_place_ui.dart';
import '../appInfo/app_info.dart';
class SearchDestinationPage extends StatefulWidget {
const SearchDestinationPage({super.key});
@override
State createState() => _SearchDestinationPageState();
}
class _SearchDestinationPageState extends State {
TextEditingController pickUpTextEditingController = TextEditingController();
TextEditingController destinationTextEditingController =
TextEditingController();
List
dropOffPredictionsPlacesList = [];
/// Places API - Place AutoComplete
searchLocation(String locationName) async {
if (locationName.length > 1) {
String apiPlacesUrl =
"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=$locationName&key=$googleMapKey&components=country:in";
var responseFromPlacesAPI =
await CommonMethods.sendRequestToAPI(apiPlacesUrl);
if (responseFromPlacesAPI == "error") {
return;
}
if (responseFromPlacesAPI["status"] == "OK") {
var predictionResultInJson = responseFromPlacesAPI["predictions"];
var predictionsList = (predictionResultInJson as List)
.map((eachPlacePrediction) =>
PredictionModel.fromJson(eachPlacePrediction))
.toList();
setState(() {
dropOffPredictionsPlacesList = predictionsList;
});
}
}
}
@override
Widget build(BuildContext context) {
String userAddress = Provider.of(context, listen: false)
.pickUpLocation!
.humanReadableAddress ??
"";
pickUpTextEditingController.text = userAddress;
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: [
Card(
elevation: 10,
child: Container(
height: 230,
decoration: const BoxDecoration(
color: Colors.black12,
boxShadow: [
BoxShadow(
color: Colors.black12,
blurRadius: 5.0,
spreadRadius: 0.5,
offset: Offset(0.7, 0.7),
),
],
),
child: Padding(
padding: const EdgeInsets.only(
left: 24, top: 48, right: 24, bottom: 20),
child: Column(
children: [
const SizedBox(
height: 6,
),
// Icon button - title
Stack(
children: [
GestureDetector(
onTap: () {
Navigator.pop(
context); // Navigate back to previous page
},
child: const Icon(
Icons.arrow_back,
color: Colors.white,
),
),
const Center(
child: Text(
"Set Dropoff Location",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
],
),
const SizedBox(
height: 18,
),
// Pickup text field
Row(
children: [
Image.asset(
"assets/images/initial.png",
height: 16,
width: 16,
),
const SizedBox(
width: 18,
),
Expanded(
child: Container(
decoration: BoxDecoration(
color: Colors.grey,
borderRadius: BorderRadius.circular(5),
),
child: Padding(
padding: const EdgeInsets.all(3),
child: TextField(
controller: pickUpTextEditingController,
decoration: const InputDecoration(
hintText: "Pickup Address",
fillColor: Colors.white12,
filled: true,
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.only(
left: 11, top: 9, bottom: 9)),
),
),
),
),
],
),
const SizedBox(
height: 11,
),
// Destination text field
Row(
children: [
Image.asset(
"assets/images/final.png",
height: 16,
width: 16,
),
const SizedBox(
width: 18,
),
Expanded(
child: Container(
decoration: BoxDecoration(
color: Colors.grey,
borderRadius: BorderRadius.circular(5),
),
child: Padding(
padding: const EdgeInsets.all(3),
child: TextField(
controller: destinationTextEditingController,
onChanged: (inputText) {
searchLocation(inputText);
},
decoration: const InputDecoration(
hintText: "Destination Address",
fillColor: Colors.white12,
filled: true,
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.only(
left: 11, top: 9, bottom: 9)),
),
),
),
),
],
),
],
),
),
),
),
// Display prediction results for destination place
(dropOffPredictionsPlacesList.isNotEmpty)
? Padding(
padding:
const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
child: ListView.separated(
padding: const EdgeInsets.all(0),
itemBuilder: (context, index) {
return Card(
elevation: 3,
child: PredictionPlaceUI(
predictedPlaceData:
dropOffPredictionsPlacesList[index],
),
);
},
separatorBuilder: (BuildContext context, int index) =>
const SizedBox(
height: 2,
),
itemCount: dropOffPredictionsPlacesList.length,
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
),
)
: Container(),
],
),
),
);
}
}
main.dart
Код: Выделить всё
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
import 'package:users_app/appinfo/app_info.dart';
import 'package:users_app/authentication/login_screen.dart';
// import 'package:users_app/authentication/signup_screen.dart';
import 'package:users_app/pages/home_page.dart';
Future main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: const FirebaseOptions(
apiKey: "*************************************",
appId: "***************************************",
messagingSenderId: "******************",
projectId: "bhromor-13f57",
),
);
// Request location permission
if (await Permission.locationWhenInUse.isDenied) {
await Permission.locationWhenInUse.request();
}
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => AppInfo(),
child: MaterialApp(
title: 'Flutter User App',
debugShowCheckedModeBanner: false,
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: Colors.black,
),
home: FirebaseAuth.instance.currentUser == null
? const LoginScreen()
: const HomePage(),
),
);
}
}
app_info.dart
Код: Выделить всё
import 'package:flutter/cupertino.dart';
import 'package:users_app/models/address_model.dart';
import 'package:flutter/foundation.dart';
class AppInfo extends ChangeNotifier {
AddressModel? _pickUpLocation;
AddressModel? dropOffLocation;
AddressModel? get pickUpLocation => _pickUpLocation;
void updatePickUpLocation(AddressModel pickUpModel) {
_pickUpLocation = pickUpModel;
notifyListeners();
}
void updateDropOffLocation(AddressModel dropOffModel) {
dropOffLocation = dropOffModel;
notifyListeners();
}
}
common_methods.dart
Код: Выделить всё
import 'dart:convert';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:users_app/appInfo/app_info.dart';
import 'package:users_app/global/global_var.dart';
import 'package:http/http.dart' as http;
import 'package:users_app/models/address_model.dart';
import 'package:provider/provider.dart';
class CommonMethods {
checkConnectivity(BuildContext context) async {
var connectionResult = await Connectivity().checkConnectivity();
if (connectionResult != ConnectivityResult.mobile &&
connectionResult != ConnectivityResult.wifi) {
if (!context.mounted) return;
displaySnackBar(
"your Internet is not Available. Check your connection. Try Again.",
context);
}
}
displaySnackBar(String messageText, BuildContext context) {
var snackBar = SnackBar(content: Text(messageText));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
static sendRequestToAPI(String apiUrl) async {
http.Response responseFromAPI = await http.get(Uri.parse(apiUrl));
try {
if (responseFromAPI.statusCode == 200) {
String dataFromApi = responseFromAPI.body;
var dataDecoded = jsonDecode(dataFromApi);
return dataDecoded;
} else {
return "error";
}
} catch (errorMsg) {
return "error";
}
}
///Reverse GeoCoding
static Future convertGeoGraphicCoOrdinatesIntoHumanReadableAddress(
Position position, BuildContext context) async {
String humanReadableAddress = "";
String apiGeoCodingUrl =
"https://maps.googleapis.com/maps/api/geocode/json?latlng=${position.latitude},${position.longitude}&key=$googleMapKey";
var responseFromAPI = await sendRequestToAPI(apiGeoCodingUrl);
if (responseFromAPI != "error") {
humanReadableAddress = responseFromAPI["results"][0]["formatted_address"];
//This is use for printing of humanReadableAddress
print("humanReadableAddress = " + humanReadableAddress);
AddressModel model = AddressModel();
model.humanReadableAddress = humanReadableAddress;
model.longitudePosition = position.longitude;
model.latitudePosition = position.latitude;
Provider.of(context, listen: false).updatePickUpLocation(model);
}
return humanReadableAddress;
}
}
Вывод:
https://drive.google.com/file/d/1pW0NkW ... sp=sharing
Подробнее здесь:
https://stackoverflow.com/questions/791 ... er-project
1731438514
Anonymous
После входа в систему home_page.dart Каждый раз, когда я запускаю это приложение, у меня возникает ошибка. Переменная humanReadableAddress (используемая для форматированного адреса в API Карт Google через геокодер) корректно выводится в журнал. Я проверил это, используя print("humanReadableAddress = " + humanReadableAddress);. Однако когда я пытаюсь использовать humanReadableAddress для автоматического заполнения текстового поля адреса получения в search_destination_pages.dart, появляется экран ошибки с красным и желтым текстом (как показано на снимке экрана). ошибка красного и желтого текста Если я удалю следующие строки из search_destination_pages.dart: [code]String userAddress = Provider.of(context, listen: false) .pickUpLocation! .humanReadableAddress ?? ""; pickUpTextEditingController.text = userAddress;[/code] тогда сообщение об ошибке больше не появляется. После удаления вышеуказанных строк из search_destination_pages.dart Однако поле адреса получения не заполняется автоматически текущим местоположением (хранящимся в humanReadableAddress). Эта проблема мешает корректной работе humanReadableAddress в моем проекте. Вот страницы проекта flutter [b]SearchDestinationPage.dart[/b] [code]import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:users_app/global/global_var.dart'; import 'package:users_app/methods/common_methods.dart'; import 'package:users_app/models/prediction_model.dart'; import 'package:users_app/widgets/prediction_place_ui.dart'; import '../appInfo/app_info.dart'; class SearchDestinationPage extends StatefulWidget { const SearchDestinationPage({super.key}); @override State createState() => _SearchDestinationPageState(); } class _SearchDestinationPageState extends State { TextEditingController pickUpTextEditingController = TextEditingController(); TextEditingController destinationTextEditingController = TextEditingController(); List dropOffPredictionsPlacesList = []; /// Places API - Place AutoComplete searchLocation(String locationName) async { if (locationName.length > 1) { String apiPlacesUrl = "https://maps.googleapis.com/maps/api/place/autocomplete/json?input=$locationName&key=$googleMapKey&components=country:in"; var responseFromPlacesAPI = await CommonMethods.sendRequestToAPI(apiPlacesUrl); if (responseFromPlacesAPI == "error") { return; } if (responseFromPlacesAPI["status"] == "OK") { var predictionResultInJson = responseFromPlacesAPI["predictions"]; var predictionsList = (predictionResultInJson as List) .map((eachPlacePrediction) => PredictionModel.fromJson(eachPlacePrediction)) .toList(); setState(() { dropOffPredictionsPlacesList = predictionsList; }); } } } @override Widget build(BuildContext context) { String userAddress = Provider.of(context, listen: false) .pickUpLocation! .humanReadableAddress ?? ""; pickUpTextEditingController.text = userAddress; return Scaffold( body: SingleChildScrollView( child: Column( children: [ Card( elevation: 10, child: Container( height: 230, decoration: const BoxDecoration( color: Colors.black12, boxShadow: [ BoxShadow( color: Colors.black12, blurRadius: 5.0, spreadRadius: 0.5, offset: Offset(0.7, 0.7), ), ], ), child: Padding( padding: const EdgeInsets.only( left: 24, top: 48, right: 24, bottom: 20), child: Column( children: [ const SizedBox( height: 6, ), // Icon button - title Stack( children: [ GestureDetector( onTap: () { Navigator.pop( context); // Navigate back to previous page }, child: const Icon( Icons.arrow_back, color: Colors.white, ), ), const Center( child: Text( "Set Dropoff Location", style: TextStyle( fontSize: 18, fontWeight: FontWeight.bold, ), ), ), ], ), const SizedBox( height: 18, ), // Pickup text field Row( children: [ Image.asset( "assets/images/initial.png", height: 16, width: 16, ), const SizedBox( width: 18, ), Expanded( child: Container( decoration: BoxDecoration( color: Colors.grey, borderRadius: BorderRadius.circular(5), ), child: Padding( padding: const EdgeInsets.all(3), child: TextField( controller: pickUpTextEditingController, decoration: const InputDecoration( hintText: "Pickup Address", fillColor: Colors.white12, filled: true, border: InputBorder.none, isDense: true, contentPadding: EdgeInsets.only( left: 11, top: 9, bottom: 9)), ), ), ), ), ], ), const SizedBox( height: 11, ), // Destination text field Row( children: [ Image.asset( "assets/images/final.png", height: 16, width: 16, ), const SizedBox( width: 18, ), Expanded( child: Container( decoration: BoxDecoration( color: Colors.grey, borderRadius: BorderRadius.circular(5), ), child: Padding( padding: const EdgeInsets.all(3), child: TextField( controller: destinationTextEditingController, onChanged: (inputText) { searchLocation(inputText); }, decoration: const InputDecoration( hintText: "Destination Address", fillColor: Colors.white12, filled: true, border: InputBorder.none, isDense: true, contentPadding: EdgeInsets.only( left: 11, top: 9, bottom: 9)), ), ), ), ), ], ), ], ), ), ), ), // Display prediction results for destination place (dropOffPredictionsPlacesList.isNotEmpty) ? Padding( padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: ListView.separated( padding: const EdgeInsets.all(0), itemBuilder: (context, index) { return Card( elevation: 3, child: PredictionPlaceUI( predictedPlaceData: dropOffPredictionsPlacesList[index], ), ); }, separatorBuilder: (BuildContext context, int index) => const SizedBox( height: 2, ), itemCount: dropOffPredictionsPlacesList.length, shrinkWrap: true, physics: const ClampingScrollPhysics(), ), ) : Container(), ], ), ), ); } } [/code] [b]main.dart[/b] [code]import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; import 'package:users_app/appinfo/app_info.dart'; import 'package:users_app/authentication/login_screen.dart'; // import 'package:users_app/authentication/signup_screen.dart'; import 'package:users_app/pages/home_page.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: const FirebaseOptions( apiKey: "*************************************", appId: "***************************************", messagingSenderId: "******************", projectId: "bhromor-13f57", ), ); // Request location permission if (await Permission.locationWhenInUse.isDenied) { await Permission.locationWhenInUse.request(); } runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return ChangeNotifierProvider( create: (context) => AppInfo(), child: MaterialApp( title: 'Flutter User App', debugShowCheckedModeBanner: false, theme: ThemeData.dark().copyWith( scaffoldBackgroundColor: Colors.black, ), home: FirebaseAuth.instance.currentUser == null ? const LoginScreen() : const HomePage(), ), ); } } [/code] [b]app_info.dart[/b] [code]import 'package:flutter/cupertino.dart'; import 'package:users_app/models/address_model.dart'; import 'package:flutter/foundation.dart'; class AppInfo extends ChangeNotifier { AddressModel? _pickUpLocation; AddressModel? dropOffLocation; AddressModel? get pickUpLocation => _pickUpLocation; void updatePickUpLocation(AddressModel pickUpModel) { _pickUpLocation = pickUpModel; notifyListeners(); } void updateDropOffLocation(AddressModel dropOffModel) { dropOffLocation = dropOffModel; notifyListeners(); } } [/code] [b]common_methods.dart[/b] [code]import 'dart:convert'; import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:geolocator/geolocator.dart'; import 'package:users_app/appInfo/app_info.dart'; import 'package:users_app/global/global_var.dart'; import 'package:http/http.dart' as http; import 'package:users_app/models/address_model.dart'; import 'package:provider/provider.dart'; class CommonMethods { checkConnectivity(BuildContext context) async { var connectionResult = await Connectivity().checkConnectivity(); if (connectionResult != ConnectivityResult.mobile && connectionResult != ConnectivityResult.wifi) { if (!context.mounted) return; displaySnackBar( "your Internet is not Available. Check your connection. Try Again.", context); } } displaySnackBar(String messageText, BuildContext context) { var snackBar = SnackBar(content: Text(messageText)); ScaffoldMessenger.of(context).showSnackBar(snackBar); } static sendRequestToAPI(String apiUrl) async { http.Response responseFromAPI = await http.get(Uri.parse(apiUrl)); try { if (responseFromAPI.statusCode == 200) { String dataFromApi = responseFromAPI.body; var dataDecoded = jsonDecode(dataFromApi); return dataDecoded; } else { return "error"; } } catch (errorMsg) { return "error"; } } ///Reverse GeoCoding static Future convertGeoGraphicCoOrdinatesIntoHumanReadableAddress( Position position, BuildContext context) async { String humanReadableAddress = ""; String apiGeoCodingUrl = "https://maps.googleapis.com/maps/api/geocode/json?latlng=${position.latitude},${position.longitude}&key=$googleMapKey"; var responseFromAPI = await sendRequestToAPI(apiGeoCodingUrl); if (responseFromAPI != "error") { humanReadableAddress = responseFromAPI["results"][0]["formatted_address"]; //This is use for printing of humanReadableAddress print("humanReadableAddress = " + humanReadableAddress); AddressModel model = AddressModel(); model.humanReadableAddress = humanReadableAddress; model.longitudePosition = position.longitude; model.latitudePosition = position.latitude; Provider.of(context, listen: false).updatePickUpLocation(model); } return humanReadableAddress; } } [/code] [b]Вывод:[/b] https://drive.google.com/file/d/1pW0NkWlzcGV9uzSENCEJdzIVV6S5xCIu/view?usp=sharing Подробнее здесь: [url]https://stackoverflow.com/questions/79182430/build-error-namespace-not-specified-for-location-package-in-flutter-project[/url]