Issue with API Integration
I’m having trouble fetching data from a RapidAPI service in my Flutter app. The loading indicator keeps spinning forever which means my HTTP request is not working properly. I’ve double checked my headers and endpoint URL but still can’t get it to work.
Here’s my service class:
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:my_app/models/listing.dart';
class DataService {
Future<List<Listing>?> fetchListings() async {
var endpoint = Uri.https('realty-api.p.rapidapi.com', '/properties/search',
{"propertyId": "12345678"});
var result = await http.get(endpoint, headers: {
"X-RapidAPI-Host": "realty-api.p.rapidapi.com",
"X-RapidAPI-Key": "my-api-key-here",
"useQueryString": "true"
});
if (result.statusCode == 200) {
return (json.decode(result.body));
} else {
throw Exception('API call failed');
}
}
}
My data model:
class Listing {
final String name;
final String details;
final String category;
final String frequency;
final String thumbnail;
final String mainPhoto;
final String phone;
final String agentName;
final String companyName;
final String companyLogo;
final String furnished;
final int virtualTours;
final int imageCount;
final int videos;
final int cost;
Listing({
required this.mainPhoto,
required this.details,
required this.name,
required this.category,
required this.frequency,
required this.thumbnail,
required this.phone,
required this.agentName,
required this.companyName,
required this.companyLogo,
required this.furnished,
required this.virtualTours,
required this.imageCount,
required this.videos,
required this.cost
});
factory Listing.fromJson(dynamic data) {
return Listing(
name: data['name'] as String,
category: data['category'] as String,
frequency: data['frequency'] as String,
mainPhoto: data['mainPhoto']['url'] as String,
thumbnail: data['images'][0]['url'] as String,
phone: data['contact']['phone'] as String,
agentName: data['agentName'] as String,
companyName: data['company']['name'] as String,
companyLogo: data['company']['logo']['url'] as String,
furnished: data['furnished'] as String,
virtualTours: data['virtualTours'] as int,
imageCount: data['imageCount'] as int,
videos: data['videos'] as int,
cost: data['cost'] as int,
details: data['details'] as String,
);
}
}
Widget implementation:
import 'package:flutter/material.dart';
import 'package:my_app/models/listing.dart';
import 'package:my_app/data_service.dart';
class ListingScreen extends StatefulWidget {
const ListingScreen({Key? key}) : super(key: key);
@override
State<ListingScreen> createState() => _ListingScreenState();
}
class _ListingScreenState extends State<ListingScreen> {
List<Listing>? _listings;
bool _dataLoaded = false;
@override
void initState() {
super.initState();
loadData();
}
Future<void> loadData() async {
_listings = await DataService().fetchListings();
if (_listings != null) {
setState(() {
_dataLoaded = true;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Visibility(
visible: _dataLoaded,
child: ListView.builder(
itemCount: _listings?.length,
itemBuilder: (context, index) {
return Container(
child: Text("Data loaded"),
);
}
),
replacement: Center(
child: CircularProgressIndicator(),
),
)
);
}
}
Any ideas what might be causing this connection issue?