Ошибка сборки: пространство имен не указано для пакета местоположения в проекте FlutterAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Ошибка сборки: пространство имен не указано для пакета местоположения в проекте Flutter

Сообщение Anonymous »

После входа в систему 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»