mirror of
https://github.com/acamarata/pray-calc-dart.git
synced 2026-06-30 19:04:25 +00:00
3.3 KiB
3.3 KiB
Flutter Integration
This example shows how to use pray_calc_dart in a Flutter widget. It reads the device's current location using geolocator and displays the current prayer times for that location.
Dependencies
Add to pubspec.yaml:
dependencies:
pray_calc_dart: ^1.0.0
geolocator: ^14.0.0
PrayerTimesCard Widget
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:pray_calc_dart/pray_calc_dart.dart';
class PrayerTimesCard extends StatefulWidget {
const PrayerTimesCard({super.key});
@override
State<PrayerTimesCard> createState() => _PrayerTimesCardState();
}
class _PrayerTimesCardState extends State<PrayerTimesCard> {
PrayerTimes? _times;
String? _error;
@override
void initState() {
super.initState();
_loadTimes();
}
Future<void> _loadTimes() async {
try {
final permission = await Geolocator.requestPermission();
if (permission == LocationPermission.denied ||
permission == LocationPermission.deniedForever) {
setState(() => _error = 'Location permission denied.');
return;
}
final pos = await Geolocator.getCurrentPosition();
// UTC offset in hours — derive from the device's local time.
final utcOffset =
DateTime.now().timeZoneOffset.inMinutes / 60.0;
final times = getTimes(
DateTime.now(),
pos.latitude,
pos.longitude,
utcOffset,
);
setState(() => _times = times);
} catch (e) {
setState(() => _error = e.toString());
}
}
@override
Widget build(BuildContext context) {
if (_error != null) {
return Text('Error: $_error');
}
if (_times == null) {
return const CircularProgressIndicator();
}
final rows = [
('Fajr', _times!.fajr),
('Sunrise', _times!.sunrise),
('Dhuhr', _times!.dhuhr),
('Asr', _times!.asr),
('Maghrib', _times!.maghrib),
('Isha', _times!.isha),
('Qiyam', _times!.qiyam),
];
return Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: rows.map((r) {
final (name, hours) = r;
return Padding(
padding: const EdgeInsets.symmetric(vertical: 2),
child: Row(
children: [
SizedBox(
width: 80,
child: Text(
name,
style: const TextStyle(fontWeight: FontWeight.w600),
),
),
Text(formatTime(hours)),
],
),
);
}).toList(),
),
),
);
}
}
Notes
getTimesis a pure synchronous function. Only the location request is async.- Pass
hanafi: truetogetTimesfor the Hanafi Asr convention (shadow factor 2 instead of 1). formatTimereturns'N/A'for unreachable events (polar nights). Handle this in the UI if targeting high-latitude users.- For production use, cache the result and re-compute once per day or on location change. Prayer times change by only a few minutes per day at most latitudes.