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-এ এটি প্রধান রান লুপ। এর অর্থ হল চ্যানেল হ্যান্ডলারে দীর্ঘমেয়াদী অপারেশন ব্যবহারকারী ইন্টারফেসকে ব্লক করে এবং হ্যাং সৃষ্টি করে। ডেভেলপারদের ব্যাকগ্রাউন্ড থ্রেডে ভারী কাজ সম্পাদন করতে এবং কলব্যাকের মাধ্যমে অ্যাসিঙ্ক্রোনাসভাবে ফলাফল ফেরত দিতে পরামর্শ দেওয়া হয়।
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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।