I'm trying to get a list of veterinary clinics within a certain radius using google-maps-api. I am able to get the clinics in one radius but not getting any results when trying to add more radius' with a dropdownbutton. the radius' should be 2.5km,5km and 10km radius. this is my code:
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/src/widgets/container.dart';
import 'package:flutter/src/widgets/framework.dart';
import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:geolocator/geolocator.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:vet_bookr/constant.dart';
import 'package:vet_bookr/models/vet_clinic.dart';
import 'package:vet_bookr/oScreens/vetMaps.dart';
import 'package:http/http.dart' as http;
import '../utils/constants.dart';
class PetClinicsPage extends StatefulWidget {
// PetClinicsPage(this.vetClinic);
const PetClinicsPage({super.key});
@override
State<PetClinicsPage> createState() => _PetClinicsPageState();
}
class _PetClinicsPageState extends State<PetClinicsPage> {
bool isLoading = true;
String dropdownvalue = 'in 2.5Kms';
var apiChanger = 0;
var apis = [
'in 2.5Kms',
'in 5Kms',
'in 10Kms',
];
@override
void initState() {
// TODO: implement initState
super.initState();
getTotalData();
}
late List<VetClinic>? vetClinic;
late GoogleMapController googleMapController;
static const String _kLocationServicesDisabledMessage =
'Location services are disabled.';
static const String _kPermissionDeniedMessage = 'Permission denied.';
static const String _kPermissionDeniedForeverMessage =
'Permission denied forever.';
static const String _kPermissionGrantedMessage = 'Permission granted.';
void _onMapCreated(GoogleMapController controller) {
googleMapController = controller;
}
Set<Marker> _markers = Set<Marker>();
Future<Position> determinePosition() async {
///Check if location is enabled
bool isLocationEnabled = await Geolocator.isLocationServiceEnabled();
if (!isLocationEnabled) {
return Future.error(_kLocationServicesDisabledMessage);
}
/**
* Request Location Permission
*/
await Geolocator.requestPermission();
///Check if the kind of permission we got
LocationPermission locationPermission = await Geolocator.checkPermission();
if (locationPermission == LocationPermission.denied) {
return Future.error(_kPermissionDeniedMessage);
}
if (locationPermission == LocationPermission.deniedForever) {
return Future.error(_kPermissionDeniedForeverMessage);
}
return Geolocator.getCurrentPosition();
}
Future<List<double>> getLatLng() async {
Position position = await determinePosition();
List<double> latLong = [position.latitude, position.longitude];
return latLong;
}
Future<void> getTotalData() async {
List<double> latLng = await getLatLng();
String vetsUrl = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?keyword=vets&location=${latLng[0]},${latLng[1]}&radius=$apiChanger&type=veterinary_care&key=${Constants.apiKey}";
///Getting the data
final response = await http.get(Uri.parse(vetsUrl));
final Map<String, dynamic> data = jsonDecode(response.body);
print(data);
vetClinic = (data["results"] as List).map((vetJson) {
print(vetJson);
return VetClinic.fromJson(vetJson);
}).toList();
print(vetClinic);
/**
* Adding the markerss
*/
if (!mounted) return;
setState(() {
isLoading = false;
});
}
clinicTile(data) {
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => VetsMaps(
vetClinic: data,
)));
},
child: Container(
margin: EdgeInsets.only(top: 0.03.sh),
width: 0.9.sw,
child: Card(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.sp),
),
child: Padding(
padding: EdgeInsets.all(10.0.sp),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
data.name,
style: TextStyle(
fontSize: 16.sp,
fontWeight: FontWeight.w400,
color: Color(0xffFF8B6A)),
),
SizedBox(
height: 0.008.sh,
),
Text(
data.address,
style:
TextStyle(fontSize: 11.sp, fontWeight: FontWeight.w300),
),
SizedBox(
height: 0.005.sh,
),
Text(
data.timing ? "Currently Open" : "Currently Closed",
style: TextStyle(
fontSize: 15.sp,
color:
data.timing ? Colors.greenAccent : Colors.redAccent),
),
SizedBox(
height: 0.005.sh,
),
Container(
child: RatingBar.builder(
initialRating: data.rating,
direction: Axis.horizontal,
allowHalfRating: true,
itemCount: 5,
itemPadding: EdgeInsets.symmetric(horizontal: 1.0),
itemSize: 0.03.sh,
itemBuilder: (context, _) => Icon(
Icons.star,
color: Colors.amber,
),
onRatingUpdate: (rating) {
print(rating);
},
ignoreGestures: true,
),
)
],
),
),
),
),
);
}
void apisChanger() async {
if(dropdownvalue == apis[0]){
apiChanger = 2500;
}
if(dropdownvalue == apis[1]){
apiChanger = 5000;
}
if(dropdownvalue == apis[2]){
apiChanger = 10000;
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.transparent,
elevation: 0,
leading: IconButton(
icon: Icon(
Icons.arrow_back,
color: Colors.black,
),
onPressed: () {
Navigator.pop(context);
},
),
),
backgroundColor: kBackgroundColor,
body: SingleChildScrollView(
child: Padding(
padding: EdgeInsets.only(top: 10.sp, left: 10.sp, right: 10.sp),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// sBox(h: 10),
Row(
children: [
Padding(
padding: EdgeInsets.only(left: 10.0.sp, top: 15.sp),
child: Text(
'Veterinary Clinics Near Me',
style: TextStyle(color: Colors.deepOrange[300], fontSize: 22),
),
),
Container(
padding: EdgeInsets.only(top: 0.02.sh, left: 0.01.sw),
height: 0.04.sh,
child: DropdownButton(
value: dropdownvalue,
underline: SizedBox(),
icon: const Icon(Icons.keyboard_arrow_down),
items: apis.map((String items) {
return DropdownMenuItem(
value: items,
child: Text(items),
);
}).toList(),
onChanged: (String? newValue) {
apisChanger();
setState(() {
dropdownvalue = newValue!;
});
},
),
), ],
),
Divider(
thickness: 2,
color: Colors.deepOrange[300],
indent: 15,
endIndent: 10,
),
// sBox(h: 1),
isLoading
? Container(
width: 1.sw,
height: 0.7.sh,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
height: 15.sp,
width: 15.sp,
child: CircularProgressIndicator(
strokeWidth: 2,
color: Color(0xffFF8B6A),
),
),
],
),
)
: ListView.builder(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: vetClinic?.length,
itemBuilder: ((context, index) {
return clinicTile(vetClinic![index]);
}),
)
],
),
),
),
);
}
}
ive tried creating a variable which changes depending on the index of the array for the dropdown button but when i try this it doesnt work