Remote Compose হল একটি Jetpack লাইব্রেরি যা আপনাকে আপনার অ্যাপে Compose-স্টাইল API-এর মাধ্যমে UI তৈরি করতে এবং অ্যাপ উইজেট বা Wear OS উইজেটের মতো সিস্টেম প্রসেসে তা দেখাতে দেয়। আপনার অ্যাপ UI-কে একটি কম্প্যাক্ট ডকুমেন্ট হিসেবে রেকর্ড করে এবং হোস্ট প্রসেসে একটি প্লেয়ার এটি রেন্ডার করে এবং আপনার অ্যাপে কল ব্যাক না করেই স্থানীয়ভাবে ইন্টার্যাকশন, স্টেট পরিবর্তন এবং অ্যানিমেশন ম্যানেজ করে।
এই গাইড Remote Compose আর্কিটেকচার এবং স্ট্যান্ডার্ড Jetpack Compose-এর থেকে এটি কীভাবে আলাদা তা ব্যাখ্যা করে। এই গাইডে কম্পোনেন্ট সহ UI তৈরি করার উপর ফোকাস করা হয়েছে।
রিমোট কম্পোজ ব্যবহারের উদাহরণ
রিমোট কম্পোজ, কাজ করে এমন প্লেয়ারের সাথে যেকোনও সারফেসে ব্যবহার করা যেতে পারে। Android-এ, এটি অ্যাপ উইজেট ও Wear OS উইজেট-কে পাওয়ার করে।
এটি কীভাবে কাজ করে: থ্রি-ব্লক আর্কিটেকচার
Remote Compose এবং স্ট্যান্ডার্ড Jetpack Compose-এর মধ্যে মৌলিক আর্কিটেকচারাল পার্থক্য হল তিনটি হাই-লেভেল ব্লক জুড়ে এক্সিকিউশন থেকে UI ডেফিনিশন ডিকাপল করা:
- ডকুমেন্ট তৈরি করা: আপনার অ্যাপ
@RemoteComposableফাংশন রান করে ডকুমেন্ট রেকর্ড করে: UI-এর একটি কম্প্যাক্ট, সিরিয়ালাইজ করা বিবরণ, যার মধ্যে এর লেআউট, রিমোট স্টেট ও অ্যাকশন অন্তর্ভুক্ত। আপনার ডেটা পরিবর্তন হলে, আপনার অ্যাপ রেকর্ড করতে এবং নতুন ডকুমেন্ট পাঠাতে পারে। - রিমোট হোস্টে ডকুমেন্ট ট্রান্সফার করা: আপনার অ্যাপ হোস্টে ডকুমেন্ট পাঠায়, যে প্রসেস এটি দেখায়, যেমন লঞ্চার বা Wear OS।
- ডকুমেন্ট চালানো: হোস্টে থাকা রিমোট কম্পোজ প্লেয়ার ডকুমেন্ট রেন্ডার করে এবং আপনার অ্যাপে কল ব্যাক না করেই লেআউট, ইনপুট, UX স্টেট পরিবর্তন ও অ্যানিমেশন স্থানীয়ভাবে ম্যানেজ করে।
এই আর্কিটেকচার প্রাথমিক সুবিধা প্রদান করে যা সরাসরি লেটেন্সি কমায়:
- ছোট সাইজের ডকুমেন্ট: সিরিয়ালাইজ করা ডকুমেন্টের স্ন্যাপশট কমপ্যাক্ট ও লাইটওয়েট থাকে।
- কম যাওয়া আসা: রিমোট হোস্ট প্লেয়ার ইন্টার্যাকশন ও স্টেট পরিবর্তন স্থানীয়ভাবে ম্যানেজ করে বলে, অ্যাপ্লিকেশন বা সার্ভারে যাওয়া আসার কমিউনিকেশন কমে যায়।
ওয়েবপেজ / HTML অ্যানালজি: রিমোট কম্পোজ, ওয়েবপেজ দেখানোর মতোই কাজ করে। অ্যাপ সার্ভার একবার HTML/ডকুমেন্ট স্ট্রাকচার তৈরি করে পাঠায় এবং ব্রাউজার হোস্ট সেটি রেন্ডার করে এবং ব্যাকএন্ডে ক্রমাগত কোয়েরি না করে স্থানীয়ভাবে ইন্টার্যাকশন ম্যানেজ করে।
উপাদানগুলি
রিমোট কম্পোজ লেআউট স্ট্রাকচার করার জন্য হাই-লেভেল UI কম্পোনেন্ট প্রদান করে। স্ট্যান্ডার্ড কম্পোজের
পরিবর্তে রিমোট কম্পোজ কম্পোনেন্ট ও RemoteModifier ব্যবহার করুন। এর মধ্যে বেসিক লেআউট কন্টেনার এবং ডায়নামিক স্ক্রিন সাইজ ম্যানেজ করার জন্য
বিশেষভাবে ডিজাইন করা অ্যাডাপ্টিভ কম্পোনেন্ট অন্তর্ভুক্ত:
- বেসিক লেআউট কম্পোনেন্ট: Compose-এর মতো সাধারণ লেআউট এলিমেন্ট যেমন
RemoteBox,RemoteRowএবংRemoteColumn। - অ্যাডাপ্টিভ লেআউট কম্পোনেন্ট: বিশেষ কম্পোনেন্ট যেমন
RemoteFitBox,RemoteCollapsibleRowএবংRemoteCollapsibleColumnযা রিমোট সারফেস জুড়ে পরিষ্কারভাবে মানিয়ে নেওয়ার জন্য ডিজাইন করা হয়েছে। - মেটেরিয়াল ডিজাইন থিমিং: Wear OS উইজেটের ক্ষেত্রে থিমিং একই পদ্ধতিতে কাজ করে,
যেখানে রঙ ও টাইপোগ্রাফির ক্রম
RemoteMaterialThemeপ্রদান করে। এটি আপনার অ্যাপ ও উইজেট জুড়ে ব্র্যান্ডিং ও ডিজাইন সিস্টেমের একই ধরনের প্রয়োগের অনুমতি দেয়।
RemoteCanvas-এর সাথে কাস্টম ড্রয়িং
কাস্টম গ্রাফিক্স এবং সময়-ভিত্তিক অ্যানিমেশনের জন্য, RemoteCanvas ব্যবহার করুন, যা
হোস্টে প্লেয়ারের চালানো ড্রয়িং কমান্ড রেকর্ড করে। এই গাইডে কম্পোনেন্ট ব্যবহার করে
UI তৈরি করার উপর ফোকাস করা হয়েছে।
প্রধান পার্থক্য
Remote Compose কীভাবে স্টেট, লজিক ও অ্যাকশন ম্যানেজ করে তা বুঝতে নিম্নলিখিত মূল ধারণাগুলি পর্যালোচনা করুন।
প্রতীকী স্টেট রেফারেন্স
স্ট্যান্ডার্ড Compose-এ, স্টেট কন্টেনারগুলি লোকাল অ্যাপ মেমরিতে অ্যাক্টিভ, রিডেবল ভ্যালু ধরে রাখে যা কিছু ঘটলে অ্যাপ কোড (ল্যাম্বডা) দ্বারা পরিবর্তিত হয়। রিমোট কম্পোজে, স্টেট ডিক্লারেশন সিম্বলিক রেফারেন্স হিসেবে কাজ করে। লোকাল অ্যাপ মেমরিতে অ্যাক্টিভ ভ্যালু ধরে রাখার পরিবর্তে, তারা বাইন্ডিং ঘোষণা করে যা রিমোট প্লেয়ার ম্যানেজ করে এবং রানটাইমে লোকালি আপডেট করে। Remote Compose-এ স্টেট ঘোষণা করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
rememberMutableRemoteInt,rememberMutableRemoteFloatঅথবাrememberMutableRemoteString-এর মতো স্ট্যাটাস ঘোষণা করতে রিমোট কম্পোজ ফ্যাক্টরি ফাংশন ব্যবহার করুন।- কম্পোজিশন চলাকালীন আপনার অ্যাপ কোড সরাসরি কোনও রিমোট স্টেট ভেরিয়েবলের ভ্যালু ইন্সপেক্ট বা রিড করতে পারে না।
- ব্যবহারকারী ডকুমেন্টের সাথে ইন্টার্যাক্ট করার সময় প্লেয়ার লোকাল মেশিনে এইসব ভ্যালু স্টোর ও আপডেট করে।
রিমোট স্টেট বনাম Kotlin কন্ট্রোল ফ্লো
আপনার অ্যাপ ডকুমেন্ট তৈরি করলে তবেই আপনার Kotlin কোড রান করে। Kotlin স্টেটমেন্ট যেমন if, when এবং for সেই সময় জানা ভ্যালুর উপর ভিত্তি করে ডকুমেন্টকে আকার দিতে পারে, যেমন তালিকার প্রতিটি আইটেমের জন্য একটি সারি রিপিট করা, কিন্তু পরে পরিবর্তন হওয়া কোনও রিমোট স্টেট অনুযায়ী কাজ করতে পারে না। Remote Compose-এ কাজ করার সময় নিম্নলিখিত বিষয়গুলি মনে রাখবেন:
- ব্রাঞ্চিং লজিক: ডাইনামিক UI সুইচিং করা হয়
RemoteStateLayoutব্যবহার করে, বিভিন্নRemoteComposableস্লটে স্টেট ম্যাপ করার মাধ্যমে। - টেক্সট মূল্যায়ন: স্ট্যান্ডার্ড Kotlin স্ট্রিং ইন্টারপোলেশন
("
$remoteValue") এড়িয়ে চলুন, যা শুধুমাত্র ডকুমেন্ট তৈরি করার সময় মূল্যায়ন করা হয়। পরিবর্তে,RemoteString-কেRemoteText-এ পাস করুন।
RemoteModifier ব্যবহার করে ডায়নামিক স্টাইলিং
হোস্টে ডায়নামিক স্টাইলিং কম্পোজিশন আবার রান করে না; পরিবর্তে, রিমোট স্টেট
ভেরিয়েবল সরাসরি মডিফায়ারে পাস করা হয়, যেমন
RemoteModifier.background(remoteColor)।
রিমোট সিস্টেম কন্টেক্সট
LocalConfiguration বা LocalDensity-এর মতো CompositionLocal প্রোভাইডার শুধুমাত্র
ডকুমেন্ট রেকর্ড করার মুহূর্তে লোকাল অ্যাপ এনভায়রনমেন্ট দেখায়। সারফেসের সাইজ পরিবর্তন, ডিসপ্লে স্ট্যাটাস পরিবর্তন বা সময়ের সাথে সাথে রিমোট হোস্টে এগুলি
ডায়নামিকভাবে আপডেট হয় না। পরিবর্তে, রানটাইমে হোস্টের উপর প্লেয়ার যে ভ্যালু
সমাধান করে, যেমন কম্পোনেন্টের বর্তমান সাইজ,
RemoteConfiguration অথবাRemoteDensity ব্যবহার করুন।
ডিক্লারেটিভ অ্যাকশন
স্ট্যান্ডার্ড কম্পোজে, ক্লিক হ্যান্ডলার হল ল্যাম্বডা যা আপনার অ্যাপে রান করে। হোস্ট
আপনার অ্যাপের কোড রান করতে পারে না, তাই রিমোট কম্পোজে আপনি পরিবর্তে অ্যাকশন অ্যাটাচ করেন, যেমন
RemoteModifier.clickable(action)-এর সাথে। কোনও অ্যাকশন valueChange-এর মাধ্যমে সরাসরি হোস্টে রিমোট স্টেট আপডেট করতে পারে অথবা pendingIntentAction বা hostAction-এর মাধ্যমে আপনার অ্যাপ বা হোস্টে হ্যান্ড অফ করতে পারে। এক ক্লিকে একাধিক অ্যাকশন রান করতে,
combinedAction ব্যবহার করুন।
উচ্চ-লেভেলের প্যারাডাইম তুলনা
ফিচার ডোমেন |
স্ট্যান্ডার্ড Jetpack Compose |
রিমোট কম্পোজ |
|---|---|---|
ক্লিক ও টাচ ইভেন্ট |
ইন-প্রসেস সিঙ্ক্রোনাস ল্যাম্বডা |
ডিক্লারেটিভ সিরিয়ালাইজড অ্যাকশন অবজেক্ট |
কন্ডিশনাল লজিক |
Kotlin if এবং when কন্ট্রোল ফ্লো |
ডকুমেন্ট তৈরি করার সময় জানা স্ট্যাটিক স্টেট, স্ট্যান্ডার্ড Kotlin ডায়নামিক ব্রাঞ্চিং |
কন্ট্রোল ফ্লো লুপ |
Kotlin-এ স্ট্যান্ডার্ড for ও while লুপ |
স্ট্যান্ডার্ড Kotlin লুপ (রিপিট, for, forEach) শুধুমাত্র ডকুমেন্ট তৈরি করার সময় রান করে। তারা হোস্টের রিমোট স্টেট লুপ করতে পারবে না |
এক্সিকিউশন হোস্ট |
অ্যাপ প্রসেস |
লঞ্চার (AppWidget), Wear OS উইজেট বা সাপোর্টিং প্লেয়ার সহ যেকোনও ফর্ম ফ্যাক্টর |
প্রসেস লাইফসাইকেল |
রিকম্পোজ ও রেন্ডার করার জন্য প্রসেস চালু রাখতে হবে |
প্রসেস রেকর্ড UI স্ন্যাপশট ডকুমেন্ট; রিমোট প্লেয়ার ইঞ্জিন কম্পোনেন্ট ট্রি পার্স করে, স্টেট মিউটেশন ট্র্যাক করে এবং অ্যাপে কল ব্যাক না করেই লোকালি রিড্র করে। |
পার্শ্ব প্রতিক্রিয়া |
Coroutine লাইফসাইকেল (LaunchedEffect) |
হোস্টে উপলভ্য নয়। ডকুমেন্ট তৈরি করার জন্য আপনার অ্যাপে কম্পোজিশন রান করে, তাই ইন্টিগ্রেশন কোনও কম্পোজিশন খোলা না রাখলে, কোরুটিন এফেক্ট রিমোট UI চালাতে পারে না। |
স্টেট প্যারাডাইম |
লোকাল মেমরি স্টেট ভ্যালু |
ফ্যাক্টরি ফাংশন (rememberMutableRemoteInt(), rememberNamedRemoteColor()) যা র ভ্যালুর পরিবর্তে সিম্বলিক স্টেট রেফারেন্স রিটার্ন করে। |