tracelet 0.3.0
tracelet: ^0.3.0 copied to clipboard
Production-grade background geolocation for Flutter. Battery-conscious tracking, geofencing, SQLite persistence, HTTP sync, and headless execution for iOS & Android.
example/main.dart
// ignore_for_file: avoid_print
import 'package:tracelet/tracelet.dart' as tl;
/// Minimal example demonstrating Tracelet background geolocation.
Future<void> main() async {
// 1. Subscribe to location events.
tl.Tracelet.onLocation((location) {
print(
'๐ ${location.coords.latitude}, ${location.coords.longitude} '
'ยท accuracy: ${location.coords.accuracy}m',
);
});
// 2. Initialize the plugin with a configuration.
final state = await tl.Tracelet.ready(
tl.Config(
geo: tl.GeoConfig(
desiredAccuracy: tl.DesiredAccuracy.high,
distanceFilter: 10,
),
logger: tl.LoggerConfig(logLevel: tl.LogLevel.verbose),
),
);
print(
'Tracelet ready โ enabled: ${state.enabled}, '
'tracking: ${state.trackingMode}',
);
// 3. Start tracking.
await tl.Tracelet.start();
}
// ---------------------------------------------------------------------------
// One-Shot Location Examples
// ---------------------------------------------------------------------------
/// Example: Single location fetch โ no continuous tracking, no persistence.
///
/// This is the simplest way to get the device's current location without
/// starting background tracking or showing a foreground notification.
Future<void> singleLocationExample() async {
// Initialize with foreground service DISABLED (Android).
// No persistent notification will be shown.
await tl.Tracelet.ready(
tl.Config(
geo: tl.GeoConfig(desiredAccuracy: tl.DesiredAccuracy.high),
app: tl.AppConfig(
stopOnTerminate: true,
foregroundService: tl.ForegroundServiceConfig(
enabled: false, // No foreground notification on Android.
),
),
),
);
// Fetch a single location โ does NOT start continuous tracking.
final location = await tl.Tracelet.getCurrentPosition(
desiredAccuracy: tl.DesiredAccuracy.high,
timeout: 30,
persist: false, // Don't store in local database.
);
print(
'๐ Single fix: ${location.coords.latitude}, '
'${location.coords.longitude} '
'accuracy: ${location.coords.accuracy}m',
);
}
/// Example: Best-of-N samples โ collect multiple GPS fixes and return the
/// one with the best (lowest) horizontal accuracy.
///
/// Useful for check-in flows, geocoding, or any scenario where you need
/// high confidence in a single reading.
Future<void> bestOfThreeSamplesExample() async {
await tl.Tracelet.ready(
tl.Config(
geo: tl.GeoConfig(desiredAccuracy: tl.DesiredAccuracy.high),
app: tl.AppConfig(
stopOnTerminate: true,
foregroundService: tl.ForegroundServiceConfig(enabled: false),
),
),
);
// Collect 3 GPS samples, return the most accurate one.
final location = await tl.Tracelet.getCurrentPosition(
desiredAccuracy: tl.DesiredAccuracy.high,
timeout: 30,
samples: 3,
persist: false,
);
print(
'๐ Best of 3: ${location.coords.latitude}, '
'${location.coords.longitude} '
'accuracy: ${location.coords.accuracy}m',
);
}
/// Example: Last known location โ instant retrieval from OS cache.
///
/// No GPS hardware is activated. Returns null if the OS has no cached
/// location (e.g. fresh device boot with no prior location providers used).
Future<void> lastKnownLocationExample() async {
await tl.Tracelet.ready(
tl.Config(
geo: tl.GeoConfig(desiredAccuracy: tl.DesiredAccuracy.high),
app: tl.AppConfig(
stopOnTerminate: true,
foregroundService: tl.ForegroundServiceConfig(enabled: false),
),
),
);
final location = await tl.Tracelet.getLastKnownLocation();
if (location == null) {
print('โ ๏ธ No cached location available');
} else {
print(
'๐ Last known: ${location.coords.latitude}, '
'${location.coords.longitude} '
'accuracy: ${location.coords.accuracy}m',
);
}
}