Flutter मोबाइल विकास · पाठ

प्लेटफ़ॉर्म चैनल (MethodChannel)

प्लेटफ़ॉर्म-विशिष्ट सुविधाओं के लिए Platform Channels का उपयोग करके मूल Android (Kotlin/Java) और iOS (Swift/Objective-C) कोड से संचार करें।

पाठ 1, कुल 4 में से12 चरण

प्लेटफ़ॉर्म चैनल (MethodChannel), CoddyKit पर Flutter मोबाइल विकास का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Flutter मोबाइल विकास सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Flutter मोबाइल विकास पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

प्लेटफ़ॉर्म चैनल: नेटिव कोड से जोड़ना

प्लेटफ़ॉर्म चैनल में आपका स्वागत है! कभी-कभी आपके Flutter ऐप को अंतर्निहित मोबाइल प्लेटफ़ॉर्म (Android या iOS) की ऐसी सुविधाओं तक पहुँचना पड़ता है, जो सीधे Flutter या Dart में उपलब्ध नहीं होतीं।

यहीं Platform Channels उपयोगी होते हैं। ये एक सेतु की तरह काम करते हैं, जिससे आपका Dart कोड Android के लिए Kotlin/Java या iOS के लिए Swift/Objective-C में लिखे गए नेटिव कोड से संवाद कर सकता है।

MethodChannel कैसे काम करता है

Platform Channels Flutter और नेटिव प्लेटफ़ॉर्म के बीच संदेश भेजने के लिए MethodChannel नामक प्रणाली का उपयोग करते हैं। इसे दो-तरफ़ा मार्ग की तरह समझें:

  • Flutter नेटिव पक्ष को विधि कॉल भेजता है।
  • नेटिव कोड विधि चलाता है और परिणाम Flutter को वापस भेजता है।

संदेश अतुल्यकालिक रूप से भेजे जाते हैं, जिससे आपका UI प्रतिक्रियाशील बना रहता है।

Flutter: MethodChannel बनाना

Flutter (Dart) वाले हिस्से में आप एक MethodChannel इंस्टेंस बनाते हैं। इसमें एक अद्वितीय स्ट्रिंग पहचानकर्ता का उपयोग करना महत्वपूर्ण है, जिसे अक्सर 'चैनल नाम' कहा जाता है। यह Flutter और नेटिव, दोनों हिस्सों में समान होना चाहिए।

डिवाइस की जानकारी प्राप्त करने के लिए एक चैनल सेट अप करते हैं:

import 'package:flutter/services.dart';
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  // Define the MethodChannel with a unique name
  static const platform = MethodChannel('com.example.app/device');
  String _deviceModel = 'Unknown';

  Future<void> _getDeviceModel() async {
    // Implementation to invoke native method will be added
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Platform Channel Demo')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Device Model: $_deviceModel'),
            ElevatedButton(
              onPressed: _getDeviceModel,
              child: Text('Get Device Model'),
            ),
          ],
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(home: HomePage()));
}

Flutter: नेटिव विधियों को कॉल करना

किसी नेटिव विधि को कॉल करने के लिए platform.invokeMethod() का उपयोग करें। यह कॉल अतुल्यकालिक होती है और एक Future लौटाती है। नेटिव हिस्से से डेटा प्राप्त करने के लिए आपको इसके परिणाम की प्रतीक्षा करनी होगी।

अब अपनी _getDeviceModel विधि को अपडेट करते हैं:

import 'package:flutter/services.dart';
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  static const platform = MethodChannel('com.example.app/device');
  String _deviceModel = 'Unknown';

  Future<void> _getDeviceModel() async {
    String deviceModel;
    try {
      // Invoking the native method 'getDeviceModel'
      final String result = await platform.invokeMethod('getDeviceModel');
      deviceModel = result; // The result from native is a String
    } on PlatformException catch (e) {
      // Catch errors sent back from the native side
      deviceModel = "Failed to get model: '${e.message}'.";
    }
    setState(() {
      _deviceModel = deviceModel;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Platform Channel Demo')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Device Model: $_deviceModel'),
            ElevatedButton(
              onPressed: _getDeviceModel,
              child: Text('Get Device Model'),
            ),
          ],
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(home: HomePage()));
}

Flutter: नेटिव को डेटा भेजना

आप नेटिव विधियों को तर्क भी भेज सकते हैं। ये तर्क Map के रूप में भेजे जाते हैं, जिससे आप विभिन्न डेटा प्रकार शामिल कर सकते हैं।

उपसर्ग और प्रत्यय के साथ एक 'कस्टम' डिवाइस मॉडल प्राप्त करने के लिए एक नई विधि बनाते हैं:

import 'package:flutter/services.dart';
import 'package:flutter/material.dart';

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  static const platform = MethodChannel('com.example.app/device');
  String _customModel = 'Unknown';

  Future<void> _getCustomModel(String prefix) async {
    String customModel;
    try {
      // Invoking with arguments: a Map
      final String result = await platform.invokeMethod(
        'getCustomModel',
        {'prefix': prefix, 'suffix': 'v1'}
      );
      customModel = result;
    } on PlatformException catch (e) {
      customModel = "Failed to get custom model: '${e.message}'.";
    }
    setState(() {
      _customModel = customModel;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Platform Channel Demo')),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Custom Model: $_customModel'),
            ElevatedButton(
              onPressed: () => _getCustomModel('MyApp'),
              child: Text('Get Custom Model'),
            ),
          ],
        ),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(home: HomePage()));
}

Android (Kotlin): चैनल सेट अप करना

Android वाले हिस्से में आप अपनी MainActivity.kt फ़ाइल में MethodChannel सेट अप करेंगे। यहीं आप यह तय करेंगे कि Flutter से आने वाली विधि कॉल को कैसे संभालना है।

सुनिश्चित करें कि आपके चैनल का नाम Flutter कोड वाले नाम से मेल खाता हो।

package com.example.coddy_app

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.app/device"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            // This block will execute when Flutter invokes a method
            call, result ->
            // Logic to handle 'call' and respond using 'result'
        }
    }
}

Android (Kotlin): कॉल संभालना

setMethodCallHandler के अंदर, आप call.method स्ट्रिंग की जाँच करके यह पहचानते हैं कि Flutter किस विधि को कॉल करने का प्रयास कर रहा है। आप call.argument() का उपयोग करके तर्कों तक भी पहुँच सकते हैं।

डेटा वापस भेजने के लिए result.success() का उपयोग करें। यदि विधि संभाली नहीं गई है, तो result.notImplemented() का उपयोग करें।

package com.example.coddy_app

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import android.os.Build // Import for device info

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.app/device"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            call, result ->
            if (call.method == "getDeviceModel") {
                val model = Build.MODEL // Get device model
                result.success(model) // Return success to Flutter
            } else if (call.method == "getCustomModel") {
                val prefix = call.argument<String>("prefix") ?: ""
                val suffix = call.argument<String>("suffix") ?: ""
                val customModel = "$prefix-${Build.MODEL}-$suffix"
                result.success(customModel)
            }
            else {
                result.notImplemented() // Indicate method not found
            }
        }
    }
}

iOS (Swift): चैनल सेट अप करना

iOS के लिए आमतौर पर आप अपनी AppDelegate.swift फ़ाइल में MethodChannel कॉन्फ़िगर करेंगे। Android की तरह, चैनल का नाम Flutter वाले हिस्से के नाम से मेल खाना चाहिए।

इस सेटअप में FlutterViewController प्राप्त करना और एक FlutterMethodChannel बनाना शामिल है।

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let deviceChannel = FlutterMethodChannel(name: "com.example.app/device",
                                                  binaryMessenger: controller.binaryMessenger)
    deviceChannel.setMethodCallHandler({ // Set up handler for incoming calls
      (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
      // Logic to handle 'call' and respond using 'result'
    })

    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

iOS (Swift): कॉल संभालना

Swift में call.method की जाँच करने के लिए आप switch कथन या if/else if का उपयोग करते हैं। तर्कों तक call.arguments के माध्यम से पहुँचा जाता है, जो आमतौर पर [String: Any] शब्दकोश होता है।

सफलता की स्थिति में मान के साथ result() का उपयोग करें। जिन विधियों को संभाला नहीं गया है, उनके लिए FlutterMethodNotImplemented का उपयोग करें।

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let deviceChannel = FlutterMethodChannel(name: "com.example.app/device",
                                                  binaryMessenger: controller.binaryMessenger)
    deviceChannel.setMethodCallHandler({ 
      (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
      if call.method == "getDeviceModel" {
        let model = UIDevice.current.model // Get device model
        result(model) // Return success to Flutter
      } else if call.method == "getCustomModel" {
        if let args = call.arguments as? [String: Any],
           let prefix = args["prefix"] as? String,
           let suffix = args["suffix"] as? String {
           let customModel = "\(prefix)-\(UIDevice.current.model)-\(suffix)"
           result(customModel)
        } else {
           result(FlutterError(code: "INVALID_ARGUMENTS", message: "Arguments missing or invalid", details: nil))
        }
      }
      else {
        result(FlutterMethodNotImplemented)
      }
    })

    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

नेटिव त्रुटियों को संभालना

नेटिव हिस्से से आने वाली त्रुटियों को उचित ढंग से संभालना बहुत महत्वपूर्ण है। नेटिव कोड result.error() (Android) या FlutterError() (iOS) का उपयोग करके त्रुटि वापस भेज सकता है।

Flutter इन्हें PlatformException के रूप में पकड़ता है। आप इन्हें try-on ब्लॉक में संभाल सकते हैं, जैसा कि हमारे Flutter कॉल के उदाहरणों में दिखाया गया है।

package com.example.coddy_app

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
import android.os.Build

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.app/device"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            call, result ->
            if (call.method == "getCustomModel") {
                val prefix = call.argument<String>("prefix")
                if (prefix == null || prefix.isEmpty()) {
                    // Sending an error back to Flutter
                    result.error("MISSING_PREFIX", "Prefix argument is required.", null)
                } else {
                    val suffix = call.argument<String>("suffix") ?: ""
                    val customModel = "$prefix-${Build.MODEL}-$suffix"
                    result.success(customModel)
                }
            }
            // ... other methods
            else { result.notImplemented() }
        }
    }
}

प्लेटफ़ॉर्म चैनल जाँच

Flutter के प्लेटफ़ॉर्म चैनलों के बारे में अपनी समझ का परीक्षण करें।

पुनरावलोकन: अंतर को पाटना

बहुत अच्छा! आपने सीखा कि नेटिव प्लेटफ़ॉर्म-विशिष्ट सुविधाओं के साथ काम करके अपने Flutter ऐप की क्षमताएँ बढ़ाने के लिए प्लेटफ़ॉर्म चैनलों का उपयोग कैसे किया जाता है।

  • आप Flutter में और हर नेटिव प्लेटफ़ॉर्म (Android/iOS) पर एक MethodChannel बनाते हैं।
  • नेटिव फ़ंक्शन को कॉल करने के लिए Flutter invokeMethod() का उपयोग करता है।
  • नेटिव कोड इन कॉल को संभालकर परिणाम या त्रुटियाँ लौटाता है।

यह शक्तिशाली तकनीक सुनिश्चित करती है कि आपके Flutter ऐप केवल उन सुविधाओं तक सीमित न रहें जो फ़्रेमवर्क सीधे उपलब्ध कराता है!

शुरुआत निःशुल्क

एआई शिक्षक के साथ Dart सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
22
पाठ
88

अक्सर पूछे जाने वाले प्रश्न

क्या “प्लेटफ़ॉर्म चैनल (MethodChannel)” पाठ निःशुल्क है?

हाँ — Flutter मोबाइल विकास अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “प्लेटफ़ॉर्म चैनल (MethodChannel)” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Flutter मोबाइल विकास पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“प्लेटफ़ॉर्म चैनल (MethodChannel)” में मैं क्या सीखूँगा?

प्लेटफ़ॉर्म-विशिष्ट सुविधाओं के लिए Platform Channels का उपयोग करके मूल Android (Kotlin/Java) और iOS (Swift/Objective-C) कोड से संचार करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Flutter मोबाइल विकास का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Flutter मोबाइल विकास शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Flutter मोबाइल विकास शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।

“प्लेटफ़ॉर्म चैनल (MethodChannel)” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Flutter मोबाइल विकास पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Flutter मोबाइल विकास पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. प्लेटफ़ॉर्म चैनल (MethodChannel)
  2. भौगोलिक स्थान और कैमरा प्लगइन
  3. मूल UI एकीकरण
  4. अनुमतियाँ और सेंसर
← Flutter मोबाइल विकास पर वापस जाएँ