প্রবাহের পরিচয়

হোম এপিআই-এর কোটলিন সংস্করণ ফ্লো ব্যবহার করে, কোটলিন ভাষার একটি বৈশিষ্ট্য যা অসিঙ্ক্রোনাস ডেটা স্ট্রীম পরিচালনার জন্য শক্তিশালী ক্ষমতা প্রদান করে, যার মধ্যে রূপান্তর, ফিল্টারিং, ম্যাপিং, সংগ্রহে রূপান্তর করা এবং সংগ্রহ করা ইত্যাদি।

Coroutines প্রবাহের সাথে ঘনিষ্ঠভাবে জড়িত, এবং অ্যাসিঙ্ক্রোনাস কোড লেখার জন্য একটি মার্জিত বিমূর্ততা প্রদান করে এবং ডেভেলপারকে স্পষ্টভাবে কলব্যাক রুটিন লিখতে হতে মুক্ত করে। একটি ফাংশন বা একটি থ্রেডের সমাপ্তির জন্য অপেক্ষা না করেই অ্যাসিঙ্ক্রোনাসভাবে কোরোটিনগুলি থেকে ডেটা পুনরুদ্ধার করার উপায় হিসাবে কাজ করে ফ্লোস কোরোটিনগুলির সাথে হাতে হাত মিলিয়ে কাজ করে৷

ভোক্তার প্রবাহ থেকে ডেটা সংগ্রহ করা হয়। কোটলিন প্রবাহের একটি collect() ফাংশন রয়েছে যা এই উদ্দেশ্যে ব্যবহার করা যেতে পারে। সংগ্রহের সময় প্রবাহে কী ঘটে তা প্রবাহের ধরণের উপর নির্ভর করে।

Kotlin ফ্লো ( Flow<T> ) ডিফল্টরূপে ঠান্ডা , যার অর্থ হল ফ্লো বিল্ডার কোড শুধুমাত্র যখন collect() বলা হয় তখনই ডেটা তৈরি করে। বিপরীতে, একটি গরম প্রবাহ অবিলম্বে ডেটা তৈরি করে, যখনই ডেটা ব্যবহার করা হয় তখনই এটিকে একটি সারির মতো মেমরিতে বাফার করে। কারণ এটি মেমরিতে ডেটা বজায় রাখে, একটি গরম প্রবাহকে রাষ্ট্রীয় বলে মনে করা হয়।

shareIn অপারেটর ব্যবহার করে প্রবাহ ঠান্ডা থেকে গরমে রূপান্তরিত হতে পারে ( shareIn ব্যবহার করে ঠান্ডা প্রবাহকে গরম করা দেখুন)। ঠান্ডা প্রবাহকে গরম প্রবাহে পরিণত করতে আপনি SharedFlow বা StateFlow ব্যবহার করতে পারেন।

নমুনা অ্যাপ কীভাবে ফ্লো ব্যবহার করে

নমুনা অ্যাপটি হোম এপিআই-এর প্রবাহের সাথে সংযুক্ত জেটপ্যাক কম্পোজের ভিউ মডেল ব্যবহার করে। নমুনা অ্যাপ্লিকেশন UI উপাদানগুলির অনেকগুলি রাষ্ট্র দ্বারা চালিত হয়, তবে এর সাথে যোগাযোগ করা যেতে পারে৷ নমুনা অ্যাপটি রিয়েলটাইম ব্যবহারকারীর অভিজ্ঞতার জন্য UI-তে একটি 'আশাবাদী' অবস্থা সহ ডিভাইসগুলির অবস্থাকেও মিশ্রিত করে। আশাবাদী শব্দটির অর্থ হল অ্যাপটি অনুমান করে যে একটি প্রদত্ত ক্রিয়া সফল হয়েছে এবং নিশ্চিতকরণের জন্য অপেক্ষা না করেই প্রত্যাশিত ফলাফল প্রতিফলিত করতে অবিলম্বে UI আপডেট করে। যদি দেখা যায় যে অ্যাকশন ব্যর্থ হয়েছে, তাহলে সত্য অবস্থা প্রতিফলিত করতে UI আপডেট করা হয়।

নমুনা অ্যাপে, ভিউ মডেলের (কাঠামো, ঘর, ডিভাইস) প্রতিটি স্তরের জন্য প্রবাহ তৈরি করা হয়। উদাহরণস্বরূপ, এটি GlobalViewModel.kt এ নিম্নলিখিত কল সহ কাঠামোর জন্য এটি করে:

  fun getStructuresState(): StateFlow<List<StructureModel>?> =
    homeClient
      .structures()
      .map { structures -> structures.map { StructureModel(it.name, it) }.sortedBy { it.name } }
      .handleErrors()
      .flowOn(Dispatchers.IO)
      .stateIn(scope = viewModelScope, started = SharingStarted.WhileSubscribed(), null)

emitAll() প্রদত্ত ফ্লো থেকে সমস্ত মান সংগ্রহ করে এবং সংগ্রাহকের কাছে নির্গত করে। stateIn() একাধিক ডাউনস্ট্রিম সাবস্ক্রাইবারদের সাথে আপস্ট্রিম প্রবাহের একটি একক চলমান উদাহরণ থেকে সাম্প্রতিক নির্গত মান শেয়ার করে। আরও তথ্যের জন্য kotlinx.coroutines.flow রেফারেন্স দেখুন।

জেটপ্যাক রচনা

স্থানীয় মেমরিতে ফ্লো অবজেক্ট সংরক্ষণ করতে এবং সেগুলিকে বন্ধ করা থেকে বিরত রাখতে, Kotlin remember API ব্যবহার করুন।

Jetpack Compose-এ, আপনি যদি collectAsStateWithLifecycle() এর সাথে এটি ব্যবহার করেন, জেটপ্যাক স্বয়ংক্রিয়ভাবে ফ্লো থেকে সদস্যতা এবং সদস্যতা ত্যাগ করা পরিচালনা করে যে সেই অবস্থাটি দেখানো অ্যাপ্লিকেশন UI বাস্তবে সামনের অংশে আছে কি না।

নমুনা অ্যাপে একটি সাধারণ কল এটি করে। আগে দেখানো getStructuresState() ফাংশন ব্যবহার করে:

val structuresList by
    remember(globalViewModel) { globalViewModel.getStructuresState() }.collectAsStateWithLifecycle()

এখন, যখন স্ট্রাকচারের জন্য কোন স্টেট পরিবর্তিত হয় (যেমন name ), কম্পোজেবল ফাংশন যা এটি ব্যবহার করে সেটি স্বয়ংক্রিয়ভাবে আপডেট হওয়া অবস্থাকে প্রতিফলিত করবে। নমুনা অ্যাপে, এটি হল HomeActivityContent() ফাংশন।

সম্পদ

কোটলিন, প্রবাহ, কোরোটিন এবং জেটপ্যাক রচনা সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন: