Reputation: 93
I am getting data api and I convert it from Json. I have this method to get data, bet when using it in a future builder it giving me getPData() method was called on null.
this is where I create getPData method:
class JsonConnection {
JsonConnection.jsonDecode();
static double pLat;
static double pLong;
PData timesList;
Future getPData() async {
final pos = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.medium);
pLat = pos.latitude;
pLong = pos.longitude;
String date = DateTime.now().toString();
int method = 4;
final url = Uri.parse(
'http://api.aladhan.com/v1/timings/$date?latitude=$pLat&longitude=$pLong&method=$method');
http.Response res = await http.get(url);
var data = json.decode(res.body);
timesList = PData.fromJson(data);
return timesList;
}
here is where I used getPData:
body: FutureBuilder(
future: jsonConnection.getPData(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
print("hello");
print(snapshot.data.meta.timezone);
if (snapshot.hasData) {
CircleAvatar();
return Center(
child: Container(
padding: const EdgeInsets.only(top: 150.0),
child: Column(
children: [
Table(
border: TableBorder.all(color: Colors.purpleAccent),
defaultColumnWidth: FixedColumnWidth(150.0),
defaultVerticalAlignment:
TableCellVerticalAlignment.middle,
children: <TableRow>[
TableRow(
children: <Widget>[
TableCell(
verticalAlignment:
TableCellVerticalAlignment.middle,
child: Center(
child: Text(snapshot.data.meta.timezone,
style: TextStyle(
color: Colors.black,
fontSize: 18,
fontWeight: FontWeight.bold)),
)),
what I can do to fix it?
Upvotes: 0
Views: 150
Reputation: 6229
Have you tested your url
in your terminal? Have you checked PData.fromJson
is doing its work well? The error message is clear about what it is happening.
I've verified the API with this code and it is working:
import 'dart:io';
import 'package:wnetworking/wnetworking.dart';
class PlayerTimes {
static const _url = 'http://api.aladhan.com/v1';
static Future<Map<String, dynamic>?> fetchTimings({DateTime? date, double? latitude, double? longitude, int method=2, String? tune, int school=0, int midnightMode=0, String? timezonestring, int? latitudeAdjustmentMethod, int? adjustment}) async {
stdout.write('Fetching timing...');
String eval(String parName, var parValue) => parValue != null ? '&$parName=$parValue' : '';
var url = '$_url/timings/${date ?? DateTime.now()}?method=$method&school=$school&midnightMode=$midnightMode${eval('latitude', latitude)}${eval('longitude', longitude)}${eval('tune', tune)}${eval('timezonestring', timezonestring)}${eval('latitudeAdjustmentMethod', latitudeAdjustmentMethod)}${eval('adjustment', adjustment)}';
return await HttpReqService
.getJson<Map<String, dynamic>>(url)
.then((response) {
if (response != null) return response['data'] as Map<String, dynamic>;
})
.whenComplete(() => print(' done\n'));
}
}
void main(List<String> args) async {
print(await PlayerTimes.fetchTimings(latitude:51.508515, longitude:0.1254872));
print('\nJob done!');
}
Result:
Fetching timing... done
{timings: {Fajr: 03:17, Sunrise: 05:20, Dhuhr: 12:56, Asr: 17:03, Sunset: 20:33, Maghrib: 20:33, Isha: 22:36, Imsak: 03:07, Midnight: 00:56}, date: {readable: 07 May 2021, timestamp: 1620342000, hijri: {date: 25-09-1442, format: DD-MM-YYYY, day: 25, weekday: {en: Al Juma'a, ar: الجمعة}, month: {number: 9, en: Ramaḍān, ar: رَمَضان}, year: 1442, designation: {abbreviated: AH, expanded: Anno Hegirae}, holidays: [Lailat-ul-Qadr]}, gregorian: {date: 07-05-2021, format: DD-MM-YYYY, day: 07, weekday: {en: Friday}, month: {number: 5, en: May}, year: 2021, designation: {abbreviated: AD, expanded: Anno Domini}}}, meta: {latitude: 51.508515, longitude: 0.1254872, timezone: Europe/London, method: {id: 2, name: Islamic Society of North America (ISNA), params: {Fajr: 15, Isha: 15}}, latitudeAdjustmentMethod: ANGLE_BASED, midnightMode: STANDARD, school: STANDARD, offset: {Imsak: 0, Fajr: 0, Sunrise: 0, Dhuhr: 0, Asr: 0, Maghrib: 0, Sunset: 0, Isha: 0, Midnight: 0}}}
Job done!
You can replace HttpReqService.getJson
with your typical http.get
.
import 'package:flutter/material.dart';
import 'package:wnetworking/wnetworking.dart';
class PlayerTimes {
static const _url = 'https://api.aladhan.com/v1';
static Future<Map<String, dynamic>?> fetchTimings({DateTime? date, double? latitude, double? longitude, int method=2, String? tune, int school=0, int midnightMode=0, String? timezonestring, int? latitudeAdjustmentMethod, int? adjustment}) async {
String eval(String parName, var parValue) => parValue != null ? '&$parName=$parValue' : '';
var url = '$_url/timings/${date ?? DateTime.now().millisecondsSinceEpoch}?method=$method&school=$school&midnightMode=$midnightMode${eval('latitude', latitude)}${eval('longitude', longitude)}${eval('tune', tune)}${eval('timezonestring', timezonestring)}${eval('latitudeAdjustmentMethod', latitudeAdjustmentMethod)}${eval('adjustment', adjustment)}';
return await HttpReqService
.getJson<Map<String, dynamic>>(url)
.then((response) {
if (response != null) return response['data'] as Map<String, dynamic>;
});
}
}
class HomePage extends StatelessWidget {
/* ---------------------------------------------------------------------------- */
const HomePage({Key? key}) : super(key: key);
/* ---------------------------------------------------------------------------- */
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Hi!'),
centerTitle: true,
),
body: Container(
child: FutureBuilder<Map<String, dynamic>?>(
future: PlayerTimes.fetchTimings(latitude:51.508515, longitude:0.1254872),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) return Text(snapshot.error.toString());
if (snapshot.hasData) return Text(snapshot.data.toString());
return Text('No Data...');
}
return CircularProgressIndicator();
},
),
),
);
}
}
Result:
Upvotes: 1