Flutter SDK: பிரிட்ஜிங் டார்ட் மற்றும் நேட்டிவ்
ட்ரேஸ்லெட் தனித்துவமானது, ஏனெனில் இது கிட்டத்தட்ட அனைத்து தர்க்கங்களையும் சொந்த iOS மற்றும் Android SDKகளுக்குத் தள்ளுகிறது. ஏன்? டார்ட் தனிமைப்படுத்தல்கள் கனமாக இருப்பதால், ஒவ்வொரு முறையும் பயனர் ஒரு அடி எடுத்து வைக்கும் போது பின்னணியில் ஃப்ளட்டர் இன்ஜினை எழுப்புவது பேட்டரி ஆயுளை அழிக்கிறது.
நிஜ உலகக் காட்சிகளில் நேட்டிவ் எஞ்சினுடன் ஃப்ளட்டர் லேயர் எவ்வாறு தொடர்பு கொள்கிறது என்பதை இந்தப் பக்கம் விளக்குகிறது.
காட்சி 1: UI சந்தா
கருத்துகள் ஆராயப்பட்டன: நிகழ்வு ஸ்ட்ரீம்கள், தலையில்லாத செயல்படுத்தல்
பிரச்சனை
நீங்கள் ஒரு உடற்பயிற்சி பயன்பாட்டை உருவாக்குகிறீர்கள். பயனர் திரையைப் பார்க்கும்போது, நிகழ்நேரத்தில் Google வரைபடத்தில் ஒரு சிறிய நீலப் புள்ளியை நகர்த்த வேண்டும். பயனர் திரையைப் பூட்டும்போது, நீங்கள் இன்னும் தரவுத்தளத்தில் ரன் பதிவு செய்ய வேண்டும், ஆனால் யாரும் பார்க்காத UI ஐ நீங்கள் புதுப்பிக்க வேண்டியதில்லை.
ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது
ட்ரேஸ்லெட் நேட்டிவ் டிராக்கிங் இன்ஜினை **டார்ட் UI ஸ்ட்ரீம்களில் இருந்து பிரிக்கிறது.
நீங்கள் Tracelet.start() ஐ அழைக்கும் போது, நேட்டிவ் iOS/Android இன்ஜின் இயங்கும். இது இயக்கம் கண்டறிதல், GPS வடிகட்டுதல், SQLite சேமிப்பு மற்றும் HTTP ஒத்திசைவை முழுவதுமாக Swift/Kotlin இல் கையாளுகிறது.
உங்கள் Flutter UI இல், நீங்கள் ஸ்ட்ரீமிற்கு குழுசேரலாம்:
import 'package:tracelet/tracelet.dart' as tl;
void initializeTracking() async {
// 1. Listen to events in the UI
tl.Tracelet.onLocation((tl.Location location) {
print('Update UI map marker: ${location.coords.latitude}, ${location.coords.longitude}');
});
tl.Tracelet.onMotionChange((tl.Location location) {
print('User started/stopped moving: ${location.isMoving}');
});
// 2. Start the native engine
await tl.Tracelet.ready(tl.Config.balanced());
await tl.Tracelet.start();
}The Magic: உங்கள் பயன்பாட்டைப் பயனர் பலவந்தமாகக் கொன்றால், onLocation டார்ட் ஸ்ட்ரீம் இறந்துவிடும். ஆனால் நேட்டிவ் டிராக்கிங் இன்ஜின் தொடர்ந்து இயங்குகிறது. இது SQLite இல் இருப்பிடங்களைச் சேமித்துக்கொண்டே இருக்கிறது. பயனர் பின்னர் பயன்பாட்டை மீண்டும் திறக்கும் போது, உங்கள் டேட்டாபேஸ் அடாப்டரைப் பயன்படுத்தி அவர்களின் வழியை வழங்க SQLite தரவுத்தளத்தை நீங்கள் வினவலாம்.
காட்சி 2: ஆன்போர்டிங் ஃப்ளோ
கருத்துகள் ஆராயப்பட்டன: அனுமதி கையாளுதல், நிராகரிப்புகள்
பிரச்சனை
வயதான நோயாளிகள் அலைந்து திரிவதைக் கண்காணிக்க ஒரு பயன்பாட்டை உருவாக்குகிறீர்கள். உங்களுக்கு “எப்போதும்” பின்னணி இருப்பிட அனுமதி தேவை. நீங்கள் கணினி அனுமதி உரையாடலை அவர்கள் மீது வீசினால், அவர்கள் குழப்பமடைவார்கள், “மறுக்கவும்” என்பதைத் தட்டவும், மேலும் பயன்பாடு பயனற்றதாகிவிடும்.
ட்ரேஸ்லெட் அதை எவ்வாறு தீர்க்கிறது
ட்ரேஸ்லெட் ஒருபோதும் தானாகவே அனுமதிகளைக் கோராது. இது UI பாய்வை முழுவதுமாக உங்கள் Flutter குறியீட்டிற்கு மாற்றுகிறது, பயமுறுத்தும் OS ப்ராம்ட்களைத் தூண்டுவதற்கு முன் கல்வி சார்ந்த தனிப்பயன் உரையாடல்களைக் காட்ட உங்களை அனுமதிக்கிறது.
import 'package:tracelet/tracelet.dart' as tl;
// 1. Check current status
final status = await tl.Tracelet.requestLocationAuthorization();
// 2. The user permanently denied permission in the past
if (status == tl.AuthorizationStatus.deniedForever) {
// Show a beautifully designed Flutter dialog explaining WHY you need it.
// Add a button that calls:
await tl.Tracelet.openAppSettings();
return;
}
// 3. We haven't asked yet, or they selected "Ask Next Time"
if (status == tl.AuthorizationStatus.notDetermined || status == tl.AuthorizationStatus.denied) {
// Ask for foreground permission first
final result = await tl.Tracelet.requestLocationAuthorization();
if (result == tl.AuthorizationStatus.whenInUse) { // They granted "When In Use"
// Show a second Flutter dialog explaining why "Always" is needed.
// Then upgrade the permission:
await tl.Tracelet.requestLocationAuthorization();
}
} Location Status
Tracelet.requestLocationAuthorization() ஒரு AuthorizationStatus enum ஐ வழங்குகிறது:
notDetermined: நீங்கள் இன்னும் கேட்கவில்லை.denied: பயனர் மறுக்கப்பட்டார் (ஆண்ட்ராய்டில் மீண்டும் கேட்கலாம்).whenInUse: முன்புறம் மட்டுமே வழங்கப்பட்டது.always: பின்னணி அணுகல் வழங்கப்பட்டது.deniedForever: பயனர் “மீண்டும் கேட்காதே” என்பதைச் சரிபார்த்தார் அல்லது iOS நிரந்தரமாக மறுக்கப்பட்டது. நீங்கள் அவற்றை அமைப்புகளுக்கு அனுப்ப வேண்டும்.