Dart कोड और नेटिव प्लेटफ़ॉर्म के बीच इंटरैक्शन Flutter एप्लिकेशन विकसित करते समय एक मुख्य कार्य है जिन्हें डिवाइस की क्षमताओं तक पहुंच की आवश्यकता होती है। Flutter Team, 2026 के अनुसार, Platform Channel ऐसे एकीकरण के लिए प्राथमिक तंत्र बना हुआ है, जो Dart और Android और iOS के नेटिव कोड के बीच अतिरिक्त नेटिव लाइब्रेरी के बिना संदेश आदान-प्रदान सक्षम करता है।
मुख्य बिंदु
Platform Channel एक Flutter तकनीक है जो एप्लिकेशन के Dart कोड और Android और iOS ऑपरेटिंग सिस्टम के नेटिव कोड के बीच द्विदिश संचार प्रदान करती है। Platform Channel के बिना, Flutter एप्लिकेशन फ्रेमवर्क द्वारा प्रदान की गई क्षमताओं तक सीमित है और कैमरा API, सेंसर, Bluetooth, फ़ाइल सिस्टम और अन्य निम्न-स्तरीय डिवाइस फ़ंक्शन तक सीधे पहुंच नहीं सकता है।
Platform Channel आर्किटेक्चर अतुल्यकालिक संदेश आदान-प्रदान के सिद्धांत पर बनाई गई है। Dart पक्ष चैनल के माध्यम से अनुरोध भेजता है, नेटिव पक्ष इसे संसाधित करता है और परिणाम लौटाता है। सभी संदेश बाइनरी प्रारूप में सीरियलाइज़ किए जाते हैं और Flutter Engine संदेश बफर के माध्यम से प्रेषित होते हैं, जो निष्पादन वातावरण के बीच डेटा स्थानांतरित करते समय न्यूनतम विलंबता सुनिश्चित करता है।
प्रत्येक Platform Channel एक अद्वितीय तार्किक नाम द्वारा पहचाना जाता है — एक स्ट्रिंग जो संदेश रूटिंग के लिए पते के रूप में कार्य करती है। Dart और नेटिव पक्ष को संचार सही ढंग से स्थापित करने के लिए एक ही चैनल नाम का उपयोग करना चाहिए। Flutter एक एप्लिकेशन में मनमानी संख्या में चैनल का समर्थन करता है, और प्रत्येक चैनल दूसरों से स्वतंत्र रूप से संचालित होता है।
आधिकारिक Flutter दस्तावेज़ीकरण के अनुसार, Platform Channel संदेशों को उसी क्रम में संसाधित करता है जिसमें वे भेजे गए थे, जो पूर्वानुमेय कॉल अनुक्रमण की गारंटी देता है। यह उन परिदृश्यों के लिए महत्वपूर्ण है जहां प्रसंस्करण क्रम शुद्धता को प्रभावित करता है, जैसे नेटिव मॉड्यूल का अनुक्रमिक आरंभीकरण या आश्रित संचालन की श्रृंखला।
Platform Channel के माध्यम से संदेश आदान-प्रदान तंत्र तीन मुख्य परतों से बना है: Dart पक्ष invokeMethod के माध्यम से Map या List के रूप में संदेश भेजता है, Flutter Engine इसे StandardMethodCodec का उपयोग करके सीरियलाइज़ करता है, और नेटिव पक्ष अपने हैंडलर में कॉल प्राप्त करता है। परिणाम उसी पथ पर विपरीत दिशा में लौटाया जाता है।
सीरियलाइज़ेशन प्रक्रिया स्वचालित रूप से Dart डेटा प्रकारों को नेटिव प्लेटफ़ॉर्म समकक्षों में परिवर्तित करती है। संख्याएं, स्ट्रिंग, बूलियन मान, सूचियां और शब्दकोश डेवलपर की ओर से अतिरिक्त कॉन्फ़िगरेशन के बिना समर्थित हैं। कस्टम डेटा प्रकारों को चैनल के माध्यम से भेजने से पहले मैन्युअल रूप से सीरियलाइज़ किया जाना चाहिए, उदाहरण के लिए JSON स्ट्रिंग में।
Flutter Engine पक्ष पर, संदेश नेटिव प्लेटफ़ॉर्म की मुख्य थ्रेड कतार में प्रवेश करता है। Android में यह एप्लिकेशन का मुख्य थ्रेड है, iOS में यह मुख्य रन लूप है। इसका मतलब है कि चैनल हैंडलर में लंबे समय तक चलने वाले संचालन उपयोगकर्ता इंटरफ़ेस को ब्लॉक करते हैं और हैंग का कारण बनते हैं। डेवलपर्स को सलाह दी जाती है कि वे भारी कार्यों को पृष्ठभूमि थ्रेड में निष्पादित करें और callback के माध्यम से अतुल्यकालिक रूप से परिणाम लौटाएं।
Platform Channel का प्रदर्शन अधिकांश उपयोग मामलों के लिए पर्याप्त है: आधुनिक उपकरणों पर एक संदेश का संचरण समय 1 मिलीसेकंड से कम है। हालांकि, उच्च-लोड संचालन जैसे रीयल-टाइम वीडियो स्ट्रीम प्रोसेसिंग के लिए, Dart FFI या डिवाइस मेमोरी तक सीधी पहुंच वाले नेटिव प्लगइन की सिफारिश की जाती है।
आर्किटेक्चर की एक मुख्य सीमा: Platform Channel फ़ाइल डिस्क्रिप्टर, मेमोरी पॉइंटर या नेटिव ऑब्जेक्ट पास करने का समर्थन नहीं करता है। सभी डेटा बाइनरी प्रारूप में सीरियलाइज़ करने योग्य होना चाहिए। मेगाबाइट रेंज में डेटा की बड़ी मात्रा स्थानांतरित करने के लिए, चैनल के माध्यम से पथ पास करके अस्थायी फ़ाइलों का उपयोग करें।
Flutter तीन प्रकार के Platform Channel प्रदान करता है, प्रत्येक एक विशिष्ट इंटरैक्शन परिदृश्य के लिए डिज़ाइन किया गया है। सही चैनल प्रकार चुनना एकीकरण आर्किटेक्चर और दोनों पक्षों — Dart और नेटिव — पर कोड रखरखाव की सुविधा निर्धारित करता है, इसलिए MethodChannel, EventChannel और BasicMessageChannel के बीच अंतर को समझना महत्वपूर्ण है।
MethodChannel Platform Channel का सबसे सामान्य प्रकार है, जो रिमोट प्रक्रिया कॉल पैटर्न को कार्यान्वित करता है। Dart मेथड नाम और आर्गुमेंट भेजता है, नेटिव पक्ष संचालन निष्पादित करता है और परिणाम लौटाता है। प्रत्येक कॉल Future लौटाता है, जो सुविधाजनक अतुल्यकालिक संचालन के लिए Dart कोड में async और await निर्माण का उपयोग करने की अनुमति देता है।
यह चैनल प्रकार अनुरोध-प्रतिक्रिया संचालन के लिए उपयुक्त है: बैटरी स्तर प्राप्त करना, सेंसर डेटा पढ़ना, नेटिव पक्ष पर गणना करना या सिस्टम सेवाओं से डेटा अनुरोध करना। MethodChannel StandardMethodCodec के माध्यम से मानक डेटा प्रकारों का समर्थन करता है, जिसमें आधुनिक Dart में Null safety समर्थन के कारण null मान शामिल हैं।
वास्तविक परियोजनाओं में, MethodChannel का उपयोग अधिकांश आधिकारिक Flutter प्लगइन में किया जाता है। उदाहरण के लिए, camera, battery और path_provider पैकेज इस प्रकार के चैनल के माध्यम से काम करते हैं, प्रत्येक प्लेटफ़ॉर्म के लिए कस्टम एकीकरण कोड लिखे बिना नेटिव API तक पहुंच प्रदान करते हैं।
EventChannel उन परिदृश्यों के लिए डिज़ाइन किया गया है जहां नेटिव पक्ष समय के साथ ईवेंट का निरंतर स्ट्रीम उत्पन्न करता है। डेटा Stream के माध्यम से Dart में पास किया जाता है, जो रीयल-टाइम अपडेट की सदस्यता की अनुमति देता है। विशिष्ट उपयोग मामलों में एक्सेलेरोमीटर रीडिंग, GPS निर्देशांक, Bluetooth स्थिति परिवर्तन और सिस्टम सेवाओं से सूचनाएं शामिल हैं।
MethodChannel के विपरीत, EventChannel प्रकाशन-सदस्यता मॉडल का उपयोग करता है। नेटिव पक्ष Dart कोड से स्पष्ट अनुरोध के बिना, ईवेंट घटित होने पर उन्हें भेजता है। Dart पक्ष पर सब्सक्राइबर प्रत्येक ईवेंट को एक अलग स्ट्रीम तत्व में प्राप्त करता है और इंटरफ़ेस में उपयोग करने से पहले प्राप्त डेटा को फ़िल्टर या रूपांतरित कर सकता है।
EventChannel का उपयोग करते समय, सदस्यताओं और उनके रद्दीकरण का उचित प्रबंधन आवश्यक है। नेटिव पक्ष पर मेमोरी लीक से बचने के लिए चैनल के साथ काम पूरा होने पर प्रत्येक StreamSubscription कॉल को रद्द किया जाना चाहिए। Flutter प्लेटफ़ॉर्म विजेट नष्ट होने पर स्वचालित रूप से स्ट्रीम को रद्द कर देता है, लेकिन स्पष्ट सदस्यता प्रबंधन लंबे समय तक चलने वाले परिदृश्यों में एप्लिकेशन विश्वसनीयता में सुधार करता है।
BasicMessageChannel Platform Channel का सबसे लचीला प्रकार है, जो मनमाने अतुल्यकालिक संदेश आदान-प्रदान के लिए डिज़ाइन किया गया है। MethodChannel के विपरीत, जहां प्रत्येक संदेश में एक मेथड नाम और आर्गुमेंट होते हैं, BasicMessageChannel बिना अंतर्निहित रूटिंग के केवल पेलोड प्रेषित करता है। प्रेषक संदेश भेजता है, प्राप्तकर्ता इसे संसाधित करता है और प्रतिक्रिया लौटाता है।
यह चैनल प्रकार कस्टम इंटरैक्शन प्रोटोकॉल के लिए सुविधाजनक है, जहां संदेश संरचना एप्लिकेशन स्थिति के आधार पर गतिशील रूप से बदल सकती है। BasicMessageChannel डिफ़ॉल्ट रूप से StandardMessageCodec का उपयोग करता है लेकिन गैर-मानक डेटा सीरियलाइज़ेशन प्रारूपों के लिए मनमाना MessageCodec प्लग इन करने का समर्थन करता है।
व्यवहार में, BasicMessageChannel MethodChannel की तुलना में कम उपयोग किया जाता है क्योंकि इसे अंतर्निहित नामकरण पैटर्न के बिना मैन्युअल संदेश रूटिंग हैंडलिंग की आवश्यकता होती है। हालांकि, नेटिव लाइब्रेरी के साथ एकीकरण करते समय यह अपरिहार्य है जो MethodChannel में कार्यान्वित मानक अनुरोध-प्रतिक्रिया पैटर्न से भिन्न विशिष्ट संदेश प्रारूप की अपेक्षा करती हैं।
आइए डिवाइस की बैटरी स्तर प्राप्त करने के उदाहरण के साथ एक व्यावहारिक Platform Channel कार्यान्वयन की जांच करें। यह उदाहरण पूर्ण कार्यप्रवाह प्रदर्शित करता है: Dart पक्ष पर MethodChannel घोषित करना, Android और iOS पर हैंडलर कार्यान्वित करना, और डेटा अनुपलब्ध होने या आवश्यक अनुमतियां गायब होने पर त्रुटियों का सही प्रबंधन करना।
Dart पक्ष पर, एक अद्वितीय स्ट्रिंग चैनल नाम के साथ MethodChannel का एक इंस्टेंस बनाया जाता है। invokeMethod मेथड नेटिव पक्ष पर अनुरोध भेजती है और Future के रूप में परिणाम की प्रतीक्षा करती है। त्रुटि प्रबंधन PlatformException को पकड़कर किया जाता है, जिसे नेटिव पक्ष अनुरोध प्रसंस्करण के दौरान अपवाद होने पर लौटाता है।
import 'package:flutter/services.dart';
class BatteryPlugin {
static const _channel = MethodChannel(
'samples.flutter.dev/battery',
);
Future<String> getBatteryLevel() async {
try {
final result = await _channel.invokeMethod<int>(
'getBatteryLevel',
);
return 'Battery level: $result%';
} on PlatformException catch (e) {
return 'Failed: ${e.message}';
}
}
}
Android पक्ष पर, हैंडलर MainActivity में configureFlutterEngine मेथड के माध्यम से पंजीकृत किया जाता है। setMethodCallHandler के अंदर, आने वाले मेथड नाम की जाँच की जाती है, बैटरी स्तर प्राप्त करने के लिए BatteryManager के लिए नेटिव कॉल की जाती है, और result ऑब्जेक्ट के माध्यम से परिणाम लौटाया जाता है। चैनल द्वारा समर्थित नहीं होने वाले मेथड के लिए result.notImplemented कॉल किया जाता है।
import android.os.BatteryManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodChannel
class MainActivity : FlutterActivity() {
private val CHANNEL = "samples.flutter.dev/battery"
override fun configureFlutterEngine(
flutterEngine: FlutterEngine
) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
CHANNEL
).setMethodCallHandler { call, result ->
if (call.method == "getBatteryLevel") {
val level = getBatteryLevel()
if (level != -1) {
result.success(level)
} else {
result.error(
"UNAVAILABLE",
"Battery level not available",
null
)
}
} else {
result.notImplemented()
}
}
}
private fun getBatteryLevel(): Int {
val manager = getSystemService(BATTERY_SERVICE) as BatteryManager
return manager.getIntProperty(
BatteryManager.BATTERY_PROPERTY_CAPACITY
)
}
}
iOS प्लेटफ़ॉर्म पर, हैंडलर AppDelegate वर्ग में FlutterMethodChannel के माध्यम से पंजीकृत किया जाता है। Swift कोड आने वाली कॉल प्राप्त करता है, बैटरी स्तर प्राप्त करने के लिए UIDevice सिस्टम API तक पहुंचता है और Flutter को परिणाम लौटाता है। weak self कैप्चर के साथ अतुल्यकालिक हैंडलिंग मेमोरी में मजबूत संदर्भ चक्र के जोखिम के बिना अनुरोध निष्पादित करने की अनुमति देता है।
import UIKit
import Flutter
@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
override func application(
application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller = window?.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(
name: "samples.flutter.dev/battery",
binaryMessenger: controller.binaryMessenger
)
channel.setMethodCallHandler { [weak self] call, result in
if call.method == "getBatteryLevel" {
let level = self?.getBatteryLevel() ?? -1
if level >= 0 {
result(level)
} else {
result(FlutterError(
code: "UNAVAILABLE",
message: "Battery level not available",
details: nil
))
}
} else {
result(FlutterMethodNotImplemented)
}
}
return super.application(
application: application,
didFinishLaunchingWithOptions: launchOptions
)
}
private func getBatteryLevel() -> Int {
let device = UIDevice.current
device.isBatteryMonitoringEnabled = true
return Int(device.batteryLevel * 100)
}
}
Platform Channel आवश्यक है जब भी किसी Flutter एप्लिकेशन को मानक पैकेज में कार्यान्वित नहीं की गई डिवाइस क्षमताओं तक पहुंच की आवश्यकता होती है। डेवलपर को कैमरा, बायोमेट्रिक्स, NFC, Bluetooth Low Energy के लिए नेटिव SDK के साथ एकीकरण करते समय या एप्लिकेशन सैंडबॉक्स के बाहर फ़ाइल सिस्टम के साथ काम करते समय एक कस्टम चैनल बनाना चाहिए।
पहला विशिष्ट परिदृश्य नेटिव API का उपयोग है जिन तक Dart से सीधी पहुंच नहीं है। इसमें Android और iOS सिस्टम सेवाएं, गैर-मानक डेटा ट्रांसफर प्रोटोकॉल वाले हार्डवेयर सेंसर, कस्टम प्रसंस्करण तर्क वाली पुश सूचनाएं और क्रिप्टोग्राफ़िक संचालन शामिल हैं जिन्हें सुरक्षित कुंजी भंडारण के लिए Hardware Security Module की आवश्यकता होती है।
दूसरा परिदृश्य Flutter प्रोजेक्ट में मौजूदा नेटिव कोड का एकीकरण है। यदि किसी कंपनी ने Android या iOS के लिए पहले से ही नेटिव लाइब्रेरी विकसित की है, तो Platform Channel इसे Dart में पोर्ट किए बिना पुनः उपयोग करने की अनुमति देता है। यह हाइब्रिड एप्लिकेशन के Flutter में माइग्रेशन को गति देता है और मौजूदा नेटिव कोड और संचित व्यावसायिक तर्क में निवेश को संरक्षित करता है।
तीसरा परिदृश्य pub.dev पर कस्टम Flutter प्लगइन प्रकाशित करना है। सभी लोकप्रिय प्लगइन एकीकृत Dart API प्रदान करने के लिए Platform Channel का उपयोग करते हैं जो अंदर से प्रत्येक प्लेटफ़ॉर्म के नेटिव कोड को कॉल करता है। यह Flutter टीम द्वारा दोनों मोबाइल प्लेटफ़ॉर्म के समर्थन वाले पुनः प्रयोज्य पैकेज बनाने के लिए अनुशंसित मानक दृष्टिकोण है।
कस्टम Platform Channel बनाने और pub.dev से तैयार पैकेज का उपयोग करने के बीच चयन करते समय, पहले मौजूदा समाधान की उपलब्धता की जाँच करने की सिफारिश की जाती है। camera, geolocator, shared_preferences और path_provider पैकेज अधिकांश विशिष्ट आवश्यकताओं को कवर करते हैं। कस्टम Platform Channel केवल तभी उचित है जब कोई उपयुक्त पैकेज मौजूद नहीं है या जब नेटिव व्यवहार के गहन अनुकूलन की आवश्यकता है जो मौजूदा समाधान प्रदान नहीं करता है।
अक्सर पूछे जाने वाले प्रश्न
MethodChannel एक मेथड कॉल और Future के माध्यम से परिणाम वापसी के साथ अनुरोध-प्रतिक्रिया पैटर्न कार्यान्वित करता है। EventChannel स्ट्रीमिंग मॉडल का उपयोग करता है: नेटिव पक्ष ईवेंट घटित होने पर उन्हें भेजता है और Dart उन्हें Stream के माध्यम से प्राप्त करता है। MethodChannel एक बार के संचालन के लिए उपयुक्त है जो परिणाम की प्रतीक्षा करते हैं, जबकि EventChannel निरंतर रीयल-टाइम डेटा स्ट्रीम के लिए है।
Platform Channel मूल Dart प्रकारों का समर्थन करता है: int, double, bool, String, List और Map। ये प्रकार डेवलपर की भागीदारी के बिना StandardMethodCodec और StandardMessageCodec के माध्यम से स्वचालित रूप से नेटिव समकक्षों में सीरियलाइज़ हो जाते हैं। कस्टम ऑब्जेक्ट पास करने के लिए JSON में मैन्युअल सीरियलाइज़ेशन या गैर-मानक प्रारूपों के समर्थन वाले कस्टम MessageCodec का उपयोग आवश्यक है।
हां, Flutter एक एप्लिकेशन में Platform Channel की असीमित संख्या का समर्थन करता है। प्रत्येक चैनल एक अद्वितीय स्ट्रिंग नाम से पहचाना जाता है जो Dart पक्ष और नेटिव प्लेटफ़ॉर्म दोनों पर मेल खाना चाहिए। विभिन्न मॉड्यूल के लिए अलग-अलग चैनल बनाए जा सकते हैं: एक कैमरा के लिए, दूसरा Bluetooth के लिए, तीसरा सेंसर के लिए — ये सभी स्वतंत्र रूप से काम करते हैं और एक दूसरे के प्रदर्शन को प्रभावित नहीं करते हैं।
Dart पक्ष पर, त्रुटियों को PlatformException के माध्यम से संभाला जाता है, जिसे नेटिव पक्ष अपवाद होने पर लौटाता है। try-catch ब्लॉक अपवाद को पकड़ता है और त्रुटि कोड, संदेश और विवरण तक पहुंच प्रदान करता है। नेटिव पक्ष पर, result.error कॉल करने से त्रुटि वापस Dart को भेजी जाती है। चैनल द्वारा समर्थित नहीं होने वाले मेथड के लिए result.notImplemented मेथड भी उपलब्ध है।
हां, Platform Channel हैंडलर नेटिव प्लेटफ़ॉर्म के मुख्य थ्रेड पर चलता है। यदि हैंडलर एक लंबा संचालन करता है — नेटवर्क अनुरोध, डिस्क रीड या भारी गणना — तो उपयोगकर्ता इंटरफ़ेस हैंग हो सकता है। नेटिव पक्ष पर पृष्ठभूमि थ्रेड में भारी कार्य चलाने और पूरा होने के बाद ही result कॉल करने की सिफारिश की जाती है। invokeMethod की अतुल्यकालिक प्रकृति के कारण Dart पक्ष ब्लॉक नहीं होता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।