फ़्लटर एसडीके: ब्रिजिंग डार्ट और नेटिव
ट्रैसलेट अद्वितीय है क्योंकि यह लगभग सभी तर्क को मूल iOS और Android SDKs तक धकेलता है। क्यों? क्योंकि डार्ट आइसोलेट्स भारी होते हैं, और जब भी उपयोगकर्ता एक कदम उठाता है तो पृष्ठभूमि में फ़्लटर इंजन को जगाने से बैटरी जीवन नष्ट हो जाता है।
यह पृष्ठ बताता है कि फ़्लटर परत वास्तविक दुनिया के परिदृश्यों में मूल इंजन के साथ कैसे इंटरैक्ट करती है।
परिदृश्य 1: यूआई सदस्यता
अवधारणाओं की खोज: घटना स्ट्रीम, नेतृत्वहीन निष्पादन
समस्या
आप एक फिटनेस ऐप बना रहे हैं. जब उपयोगकर्ता स्क्रीन को देख रहा होता है, तो आप वास्तविक समय में Google मानचित्र पर एक छोटा नीला बिंदु देखना चाहते हैं। जब उपयोगकर्ता स्क्रीन लॉक करता है, तब भी आप डेटाबेस में रन रिकॉर्ड करना चाहते हैं, लेकिन आपको यूआई को अपडेट करने की आवश्यकता नहीं है जिसे कोई नहीं देख रहा है।
ट्रेसलेट इसे कैसे हल करता है
ट्रैसलेट नेटिव ट्रैकिंग इंजन को डार्ट यूआई स्ट्रीम से अलग करता है।
जब आप Tracelet.start() पर कॉल करते हैं, तो मूल iOS/Android इंजन चालू हो जाता है। यह पूरी तरह से स्विफ्ट/कोटलिन में मोशन डिटेक्शन, जीपीएस फ़िल्टरिंग, SQLite सेविंग और HTTP सिंकिंग को संभालता है।
आपके फ़्लटर यूआई में, आप बस स्ट्रीम की सदस्यता लेते हैं:
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();
}द मैजिक: यदि उपयोगकर्ता आपके ऐप को बलपूर्वक बंद कर देता है, तो onLocation डार्ट स्ट्रीम बंद हो जाती है। लेकिन मूल ट्रैकिंग इंजन चलता रहता है। यह स्थानों को SQLite में सहेजता रहता है। जब उपयोगकर्ता बाद में ऐप को दोबारा खोलता है, तो आप उनके रूट को रेंडर करने के लिए अपने डेटाबेस एडाप्टर का उपयोग करके SQLite डेटाबेस को क्वेरी कर सकते हैं।
परिदृश्य 2: ऑनबोर्डिंग प्रवाह
अवधारणाओं की खोज: अनुमति प्रबंधन, अस्वीकृतियाँ
समस्या
आप भटकते हुए बुजुर्ग मरीजों पर नज़र रखने के लिए एक ऐप बना रहे हैं। आपको “हमेशा” पृष्ठभूमि स्थान अनुमति की आवश्यकता है। यदि आप सिस्टम अनुमति संवाद उन पर फेंक देते हैं, तो वे भ्रमित हो जाएंगे, “अस्वीकार करें” पर टैप करें, और ऐप बेकार हो जाएगा।
ट्रेसलेट इसे कैसे हल करता है
ट्रैसलेट कभी स्वचालित रूप से अनुमतियों का अनुरोध नहीं करता है। यह यूआई प्रवाह को पूरी तरह से आपके फ़्लटर कोड तक छोड़ देता है, जिससे आप डरावने ओएस संकेतों को ट्रिगर करने से पहले शैक्षिक कस्टम संवाद दिखा सकते हैं।
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 एनम लौटाता है:
notDetermined: आपने अभी तक नहीं पूछा है।denied: उपयोगकर्ता ने इनकार कर दिया (एंड्रॉइड पर फिर से पूछ सकता है)।whenInUse: केवल अग्रभूमि प्रदान की गई।always: पृष्ठभूमि पहुंच प्रदान की गई।deniedForever: उपयोगकर्ता ने “दोबारा न पूछें” चेक किया या iOS ने स्थायी रूप से अस्वीकृत कर दिया। आपको उन्हें सेटिंग्स में भेजना होगा.