🚀 قسمت چهارم از سری «Flow»؛ اینبار با «map» و «filter» دادهها رو شکل میدیم!
🧠 این دو اپراتور بهت اجازه میدن دادههای در حال جریان رو تبدیل کنی یا ناخواستهها رو حذف کنی.
📱 مثال واقعی: لیست سفارشها از سرور میاد و فقط قیمتهای بالای ۱۰۰ هزار تومن مهم هستن.
بذار با یک مثال ساده ببینیم:
✅ خروجی: فقط «Order: 120000 Toman» و «Order: 200000 Toman» میمونه.
«filter» اول دادههای اضافی رو حذف میکنه، بعد «map» فرمت نهایی رو میسازه.
💡 نکته: ترتیب این دو اپراتور مهمه؛ اگر «map» اول باشه، همه آیتمها تبدیل میشن و بعد فیلتر.
در «Jetpack Compose» با «StateFlow» این ترکیب برای مدیریت وضعیت «UI» خیلی کاربردیه.
🔥 پس دفعه بعد بهجای حلقههای پیچیده، از «map» و «filter» استفاده کن.
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #Filter #Map
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🧠 این دو اپراتور بهت اجازه میدن دادههای در حال جریان رو تبدیل کنی یا ناخواستهها رو حذف کنی.
📱 مثال واقعی: لیست سفارشها از سرور میاد و فقط قیمتهای بالای ۱۰۰ هزار تومن مهم هستن.
بذار با یک مثال ساده ببینیم:
flowOf(50_000, 120_000, 80_000, 200_000)
.filter { it > 100_000 }
.map { "Order: $it Toman" }
.collect { println(it) }
✅ خروجی: فقط «Order: 120000 Toman» و «Order: 200000 Toman» میمونه.
«filter» اول دادههای اضافی رو حذف میکنه، بعد «map» فرمت نهایی رو میسازه.
💡 نکته: ترتیب این دو اپراتور مهمه؛ اگر «map» اول باشه، همه آیتمها تبدیل میشن و بعد فیلتر.
در «Jetpack Compose» با «StateFlow» این ترکیب برای مدیریت وضعیت «UI» خیلی کاربردیه.
🔥 پس دفعه بعد بهجای حلقههای پیچیده، از «map» و «filter» استفاده کن.
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #Filter #Map
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥2❤1
توی قسمت پنجم سری آموزشی «Flow»، سراغ «onEach» و «launchIn» میریم؛ دو ابزار قدرتمند برای مدیریت هوشمندانه جریان دادهها! 🧩
«onEach» بهت اجازه میده قبل از اینکه مقدار به دست مصرفکننده برسه، یه عملیات میانی روش انجام بدی؛ مثل ذخیرهسازی یا لاگ گرفتن. 📝
«launchIn» هم کار «collect» رو انجام میده ولی بدون اینکه مجبور باشی خودت «Coroutine» بسازی؛ فقط کافیه «Scope» رو بدی. 🚀
این دو باهم یه ترکیب عالی برای «ViewModel» هستن؛ دادهها رو دریافت میکنی، پردازش میکنی و رابط کاربری رو هم بلاک نمیکنی. 🔥
فرض کن دادههای دمای سنسور رو میگیری و باید هر مقدار رو توی «Room Database» ذخیره کنی؛ کد زیر رو ببین:
توی این کد، «onEach» هر مقدار خروجی سنسور رو قبل از ارسال به مصرفکننده ذخیره میکنه و «launchIn» مطمئن میشه همهچیز توی «viewModelScope» اجرا بشه. 🎯
یعنی نه خبری از «collect» دستیه، نه «launch» اضافه؛ کدت خلوت و خواناتر میشه.
یه نکته حرفهای: «launchIn» یه «Job» برمیگردونه؛ با «cancel» کردنش میتونی هر موقع خواستی جمعآوری رو متوقف کنی. 💡
اگه این الگو رو یاد بگیری، دیگه مجبور نیستی توی هر «Fragment» یا «ViewModel» کد تکراری بنویسی و مدیریت «Coroutine» هم دقیق و اصولی میشه. 📈
تمرین کن و این دو تا رو جایگزین «collect» های اضافی کن؛ نتیجه رو توی تمیزی کدهات فوراً حس میکنی.
#Codeit #Android #Kotlin #Jetpack #KotlinFlow #Flow #Coroutine #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
«onEach» بهت اجازه میده قبل از اینکه مقدار به دست مصرفکننده برسه، یه عملیات میانی روش انجام بدی؛ مثل ذخیرهسازی یا لاگ گرفتن. 📝
«launchIn» هم کار «collect» رو انجام میده ولی بدون اینکه مجبور باشی خودت «Coroutine» بسازی؛ فقط کافیه «Scope» رو بدی. 🚀
این دو باهم یه ترکیب عالی برای «ViewModel» هستن؛ دادهها رو دریافت میکنی، پردازش میکنی و رابط کاربری رو هم بلاک نمیکنی. 🔥
فرض کن دادههای دمای سنسور رو میگیری و باید هر مقدار رو توی «Room Database» ذخیره کنی؛ کد زیر رو ببین:
sensorRepository.sensorFlow
.onEach { data ->
localCache.save(data)
}
.launchIn(viewModelScope)
توی این کد، «onEach» هر مقدار خروجی سنسور رو قبل از ارسال به مصرفکننده ذخیره میکنه و «launchIn» مطمئن میشه همهچیز توی «viewModelScope» اجرا بشه. 🎯
یعنی نه خبری از «collect» دستیه، نه «launch» اضافه؛ کدت خلوت و خواناتر میشه.
یه نکته حرفهای: «launchIn» یه «Job» برمیگردونه؛ با «cancel» کردنش میتونی هر موقع خواستی جمعآوری رو متوقف کنی. 💡
اگه این الگو رو یاد بگیری، دیگه مجبور نیستی توی هر «Fragment» یا «ViewModel» کد تکراری بنویسی و مدیریت «Coroutine» هم دقیق و اصولی میشه. 📈
تمرین کن و این دو تا رو جایگزین «collect» های اضافی کن؛ نتیجه رو توی تمیزی کدهات فوراً حس میکنی.
#Codeit #Android #Kotlin #Jetpack #KotlinFlow #Flow #Coroutine #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1
اگه دو تا «Flow» داشته باشی که بخوای همزمان وضعیتشون رو باهم ترکیب کنی، «combine» دقیقاً همون چیزیه که بهش نیاز داری. 🔗
فرقش با «zip» اینه که «zip» فقط جفتهای همردیف رو ترکیب میکنه، ولی «combine» با هر بار انتشار از هر کدوم از «Flow»ها، آخرین مقدار هر دو رو برداشته و نتیجه جدید میسازه. 📡
این رفتار توی اپهای واقعی خیلی به کار میاد؛ مثلاً فرم ورود که همزمان باید username و password رو چک کنی. 🧠
فرض کن یه صفحه لاگین داری که دکمه ورود فقط وقتی فعال بشه که نام کاربری پر باشه و رمز حداقل ۶ کاراکتر داشته باشه. ✨
با «combine» میتونی این دو «Flow» رو به یه «StateFlow» بولین تبدیل کنی و UI بهصورت خودکار واکنش نشون بده. ⚡
بذار یه نمونه ساده رو ببینیم:
این کد هر بار که یکی از فیلدها تغییر کنه، شرط رو از روی آخرین مقادیر دوباره ارزیابی میکنه. نتیجه یه فرآیند Reactive کاملاً شفافه. 💡
حالا اگه بخوای چند «Flow» رو باهم ترکیب کنی، «combine» میتونه تا ۵ پارامتر مختلف پشتیبانی کنه. 🚀
پس بهجای مدیریت دستی چند «Flow» جدا، بذار «combine» کار ترکیب رو برات انجام بده. اینطوری کدت کوتاهتر و خواناتر میشه. 🔥
اگه قسمت قبل سری رو ندیدی، حتماً از اول مرور کن که مفاهیم «Flow» و «StateFlow» کامل برات جا بیفته. ✅
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #StateFlow #Reactive
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
فرقش با «zip» اینه که «zip» فقط جفتهای همردیف رو ترکیب میکنه، ولی «combine» با هر بار انتشار از هر کدوم از «Flow»ها، آخرین مقدار هر دو رو برداشته و نتیجه جدید میسازه. 📡
این رفتار توی اپهای واقعی خیلی به کار میاد؛ مثلاً فرم ورود که همزمان باید username و password رو چک کنی. 🧠
فرض کن یه صفحه لاگین داری که دکمه ورود فقط وقتی فعال بشه که نام کاربری پر باشه و رمز حداقل ۶ کاراکتر داشته باشه. ✨
با «combine» میتونی این دو «Flow» رو به یه «StateFlow» بولین تبدیل کنی و UI بهصورت خودکار واکنش نشون بده. ⚡
بذار یه نمونه ساده رو ببینیم:
val username = MutableStateFlow("")
val password = MutableStateFlow("")
val isLoginEnabled = combine(username, password) { user, pass ->
user.isNotBlank() && pass.length >= 6
}.stateIn(viewModelScope, SharingStarted.Eagerly, false)
این کد هر بار که یکی از فیلدها تغییر کنه، شرط رو از روی آخرین مقادیر دوباره ارزیابی میکنه. نتیجه یه فرآیند Reactive کاملاً شفافه. 💡
حالا اگه بخوای چند «Flow» رو باهم ترکیب کنی، «combine» میتونه تا ۵ پارامتر مختلف پشتیبانی کنه. 🚀
پس بهجای مدیریت دستی چند «Flow» جدا، بذار «combine» کار ترکیب رو برات انجام بده. اینطوری کدت کوتاهتر و خواناتر میشه. 🔥
اگه قسمت قبل سری رو ندیدی، حتماً از اول مرور کن که مفاهیم «Flow» و «StateFlow» کامل برات جا بیفته. ✅
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #StateFlow #Reactive
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1
همیشه «هوش مصنوعی» رو بهعنوان دستیار ببین نه جایگزین ذهنت 🧠
اگر هر سوال رو مستقیم از «ChatGPT» بپرسی، کمکم عضله فکریات ضعیف میشه 💪⚠️
بهترین راهکار: اول خودت تحلیل کن، بعد از «AI» برای تکمیل یا تصحیح استفاده کن 📝
مثلاً توی «Android Debugging» به جای اینکه خطا رو بدی به «AI»، اول خودت «Logcat» رو بخون 🐞
نمونه عملی:
وقتی با «Crash» توی «Kotlin» مواجه میشی، اول «Stack Trace» رو بررسی کن، بعد از «AI» برای درک بهتر کمک بگیر 👇
با این روش، هم یاد میگیری، هم وابسته نمیشی 🚀
نکته مهم: همیشه قبل از استفاده از «AI»، جواب خودت رو داشته باش 🎯
#Codeit #Android #Kotlin #Jetpack #AI #Productivity #DeveloperMindset
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
اگر هر سوال رو مستقیم از «ChatGPT» بپرسی، کمکم عضله فکریات ضعیف میشه 💪⚠️
بهترین راهکار: اول خودت تحلیل کن، بعد از «AI» برای تکمیل یا تصحیح استفاده کن 📝
مثلاً توی «Android Debugging» به جای اینکه خطا رو بدی به «AI»، اول خودت «Logcat» رو بخون 🐞
نمونه عملی:
وقتی با «Crash» توی «Kotlin» مواجه میشی، اول «Stack Trace» رو بررسی کن، بعد از «AI» برای درک بهتر کمک بگیر 👇
// مرحله اول: خودت تحلیل کن
val errorMessage = "NullPointerException: cannot read field"
val possibleCause = "maybe the variable is not initialized"
// مرحله دوم: از AI برای تأیید یا تکمیل استفاده کن
// "AI, check my analysis: NullPointerException in Kotlin - possible cause: "
با این روش، هم یاد میگیری، هم وابسته نمیشی 🚀
نکته مهم: همیشه قبل از استفاده از «AI»، جواب خودت رو داشته باش 🎯
#Codeit #Android #Kotlin #Jetpack #AI #Productivity #DeveloperMindset
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1👍1🔥1
🔄 ترکیب دو «Flow» با عملگر «zip» — دقیقاً مثل زیپ کاپشن!
وقتی دو جریان داده دارید و میخواهید هر جفت مقدار رو بههم بچسبونید و یه خروجی جدید بسازید، «zip» بهترین انتخاب است.
🧠 فرض کنید از دو سنسور مجزا دما و رطوبت دریافت میکنید. «zip» جفتهای همترتیب رو ترکیب میکند.
مثال عملی: ترکیب اطلاعات کاربران از دو منبع مختلف.
💻 کد ساده با «zip» در «Kotlin»:
📌 نکته: اگر تعداد جفتها نامساوی باشد، جفتهای اضافی حذف میشوند.
✅ «zip» برای ترکیب دقیق دو جریان موازی عالی است.
🎯 این عملگر رو در سناریوهای real-time فراموش نکنید.
#Codeit #Android #Kotlin #Jetpack #Flow #KotlinFlows #ReactiveProgramming
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
وقتی دو جریان داده دارید و میخواهید هر جفت مقدار رو بههم بچسبونید و یه خروجی جدید بسازید، «zip» بهترین انتخاب است.
🧠 فرض کنید از دو سنسور مجزا دما و رطوبت دریافت میکنید. «zip» جفتهای همترتیب رو ترکیب میکند.
مثال عملی: ترکیب اطلاعات کاربران از دو منبع مختلف.
💻 کد ساده با «zip» در «Kotlin»:
val flowA = flowOf("دما: ۲۵°", "دما: ۲۶°", "دما: ۲۷°")
val flowB = flowOf("رطوبت: ۴۰%", "رطوبت: ۴۲%")
flowA.zip(flowB) { temp, humidity ->
"$temp — $humidity"
}.collect { combined ->
println(combined)
}
// خروجی:
// دما: ۲۵° — رطوبت: ۴۰%
// دما: ۲۶° — رطوبت: ۴۲%
// (جفت سوم چون جفت ندارد، نادیده گرفته میشود)
📌 نکته: اگر تعداد جفتها نامساوی باشد، جفتهای اضافی حذف میشوند.
✅ «zip» برای ترکیب دقیق دو جریان موازی عالی است.
🎯 این عملگر رو در سناریوهای real-time فراموش نکنید.
#Codeit #Android #Kotlin #Jetpack #Flow #KotlinFlows #ReactiveProgramming
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2
🚀 جستجوی هوشمند با
بالاخره وقتشه تایپ کاربر رو بهینه مدیریت کنیم!
⏳ تا حالا شده کاربر توی سرچ باکس تند تند تایپ کنه و هر کاراکتر باعث یه درخواست جدید بشه؟
این یعنی ترافیک بیفایده و کندی UI!
🔥 راهحل ساده: اپراتور
این قابلیت باعث میشه فقط بعد از توقف تایپ (مثلاً ۳۰۰ میلیثانیه) درخواست ارسال بشه.
📱 مثال واقعی: یه اپ لیست محصولات که کاربر اسم کالا رو تایپ میکنه:
✅ این کد چیکار میکنه؟
- وقتی کاربر تایپ میکنه، ۳۰۰ میلیثانیه صبر میکنه
- اگر تایپ قطع بشه، درخواست API میره
- از تکرار مقادیر تکراری جلوگیری میکنه
- نتیجه رو به صورت خودکار به UI میرسونه
💡 مزیت بزرگ:
کاهش ۸۰٪ درخواستهای اضافی + تجربه کاربری عالی
بدون نیاز به Handler یا Timer سنتی!
🌟 نکته حرفهای:
مقدار
برای جستجوی فوری (مثل جستجوی زنده) ۳۰۰-۵۰۰ میلیثانیه عالیه.
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #CleanCode #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
«debounce» در «Kotlin Flow» بالاخره وقتشه تایپ کاربر رو بهینه مدیریت کنیم!
⏳ تا حالا شده کاربر توی سرچ باکس تند تند تایپ کنه و هر کاراکتر باعث یه درخواست جدید بشه؟
این یعنی ترافیک بیفایده و کندی UI!
🔥 راهحل ساده: اپراتور
«debounce» تو «Kotlin Flow» این قابلیت باعث میشه فقط بعد از توقف تایپ (مثلاً ۳۰۰ میلیثانیه) درخواست ارسال بشه.
📱 مثال واقعی: یه اپ لیست محصولات که کاربر اسم کالا رو تایپ میکنه:
class SearchViewModel : ViewModel() {
private val _query = MutableStateFlow("")
val searchResults: StateFlow<List<Product>> = _query
.debounce(300) // صبر کن 300 میلیثانیه بعد از آخرین تغییر
.filter { it.length >= 2 } // حداقل 2 کاراکتر
.distinctUntilChanged() // فقط مقدار جدید
.flatMapLatest { query ->
repository.searchProducts(query) // API call
}
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = emptyList()
)
fun onQueryChanged(query: String) {
_query.value = query
}
}
✅ این کد چیکار میکنه؟
- وقتی کاربر تایپ میکنه، ۳۰۰ میلیثانیه صبر میکنه
- اگر تایپ قطع بشه، درخواست API میره
- از تکرار مقادیر تکراری جلوگیری میکنه
- نتیجه رو به صورت خودکار به UI میرسونه
💡 مزیت بزرگ:
کاهش ۸۰٪ درخواستهای اضافی + تجربه کاربری عالی
بدون نیاز به Handler یا Timer سنتی!
🌟 نکته حرفهای:
مقدار
debounce رو متناسب با سرعت تایپ کاربر تنظیم کن. برای جستجوی فوری (مثل جستجوی زنده) ۳۰۰-۵۰۰ میلیثانیه عالیه.
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #CleanCode #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1
در دنیای پر دادهٔ امروز، پردازش تکراریها فقط مصرف منابع و کند شدن اپ رو به دنبال داره. 🚀
آیا میدونستی «Flow» میتونه مقادیر تکراری متوالی رو قبل از رسیدن به «collector» حذف کنه؟ 🧠
با استفاده از «distinctUntilChanged»، فقط زمانی مقدار جدید به مصرفکننده میرسه که باهاش متفاوت باشه. این یعنی پردازش هوشمند و بیدغدغه. 🎯
کاربرد عملیش کجاست؟ مثلاً «StateFlow» در «ViewModel» که فقط تغییرات واقعی رو به UI بفرسته. از نمایش دوبارهٔ لیست با همون داده جلوگیری کن. ✅
حالا یه مثال ساده:
در این کد، فقط مقادیر «1» و «2» و «3» و «1» و «2» خروجی داده میشن. تکرارهای متوالی مثل «1,1» یا «2,2» نادیده گرفته میشن. یعنی حذف هوشمند دادههای تکراری بدون از دست دادن توالی منطقی. 🧹
یادت باشه: «distinctUntilChanged» رو با مقایسهٔ عمیق «distinctUntilChangedBy» اشتباه نگیری. اولی برابر ساده (با «equals») و دومی بر اساس «selector» دلخواه عمل میکنه. 🛠️
پس توی پروژههای حرفهای، از این اپراتور برای بهینهسازی «Recomposition» در «Jetpack Compose» و کاهش بار پردازشی استفاده کن. 🚀
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #DistinctUntilChanged #Performance
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
آیا میدونستی «Flow» میتونه مقادیر تکراری متوالی رو قبل از رسیدن به «collector» حذف کنه؟ 🧠
با استفاده از «distinctUntilChanged»، فقط زمانی مقدار جدید به مصرفکننده میرسه که باهاش متفاوت باشه. این یعنی پردازش هوشمند و بیدغدغه. 🎯
کاربرد عملیش کجاست؟ مثلاً «StateFlow» در «ViewModel» که فقط تغییرات واقعی رو به UI بفرسته. از نمایش دوبارهٔ لیست با همون داده جلوگیری کن. ✅
حالا یه مثال ساده:
val numberFlow = flowOf(1, 1, 2, 2, 3, 3, 1, 2, 2)
.distinctUntilChanged()
numberFlow.collect { value ->
println("Received: $value")
}
در این کد، فقط مقادیر «1» و «2» و «3» و «1» و «2» خروجی داده میشن. تکرارهای متوالی مثل «1,1» یا «2,2» نادیده گرفته میشن. یعنی حذف هوشمند دادههای تکراری بدون از دست دادن توالی منطقی. 🧹
یادت باشه: «distinctUntilChanged» رو با مقایسهٔ عمیق «distinctUntilChangedBy» اشتباه نگیری. اولی برابر ساده (با «equals») و دومی بر اساس «selector» دلخواه عمل میکنه. 🛠️
پس توی پروژههای حرفهای، از این اپراتور برای بهینهسازی «Recomposition» در «Jetpack Compose» و کاهش بار پردازشی استفاده کن. 🚀
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #DistinctUntilChanged #Performance
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2👍1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 در کاتلین، ما استانداردهای آموزش رو جابهجا میکنیم!
برنامهنویسی اندروید فقط یادگیری چند خط کد ساده نیست؛ اجرا کردن ایدههای بزرگ با کدهای تمیز، سریع و بهینهست. Kotlin تا این مسیر رو برات هموار کنیم.
ما توی کدایت با قدرت، تخصص و به صورت کاملاً عمیق روی آموزش کاتلین — از مفاهیم اولیه تا پیچیدهترین سطوح پیشرفته — تمرکز کردیم. هدف ما اینه که به جای یادگیری سطحی، به تسلط واقعی و بازارکاری برسی.
💡 چرا محتوای آموزشی کدایت؟
⚡️ مسیر سناریومحور: یادگیری مفاهیم در قالب پروژهها و نیازهای واقعی بازار
⚡️ معماریهای مدرن اندروید
⚡️ Guide to Clean Code: Clean Code (Best Practices)
اگر میخوای توی دنیای کاتلین یک لول بالاتر از بقیه قرار بگیری، جای درستی اومدی. ما پرقدرت کنارت هستیم! 💪
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #DistinctUntilChanged #Performance
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
برنامهنویسی اندروید فقط یادگیری چند خط کد ساده نیست؛ اجرا کردن ایدههای بزرگ با کدهای تمیز، سریع و بهینهست. Kotlin تا این مسیر رو برات هموار کنیم.
ما توی کدایت با قدرت، تخصص و به صورت کاملاً عمیق روی آموزش کاتلین — از مفاهیم اولیه تا پیچیدهترین سطوح پیشرفته — تمرکز کردیم. هدف ما اینه که به جای یادگیری سطحی، به تسلط واقعی و بازارکاری برسی.
💡 چرا محتوای آموزشی کدایت؟
⚡️ مسیر سناریومحور: یادگیری مفاهیم در قالب پروژهها و نیازهای واقعی بازار
⚡️ معماریهای مدرن اندروید
⚡️ Guide to Clean Code: Clean Code (Best Practices)
اگر میخوای توی دنیای کاتلین یک لول بالاتر از بقیه قرار بگیری، جای درستی اومدی. ما پرقدرت کنارت هستیم! 💪
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #DistinctUntilChanged #Performance
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤1🔥1🥰1👏1
سلام رفیق شغلی! 🚀
همیشه از مصاحبههای فنی استرس داری؟ 🤔
این حس برای همه آشناست؛ اما نگران نباش، راهکار داره. 📝
اولین نکته: «رزومه» تو خط مقدمه. اون رو بر اساس موقعیت شغلی هدف شخصیسازی کن. ✨
دوم: پروژهها رو عمیق بلد باش. تو مصاحبه ازت میپرسن چرا از «ViewModel» استفاده کردی یا چطور مشکل «همگامسازی» رو حل کردی. 🛠️
سوم: الگوریتم و ساختمان داده رو با تمرین مداوم روی «LeetCode» یا «HackerRank» قورت بده. هر روز ۱-۲ تا مسئله کافیه. 🧩
چهارم: انگلیسی رو تقویت کن. بیشتر مصاحبههای خوب به انگلیسی انجام میشن. با خودت توی آینه تمرین کن. 🗣️
پنجم: «SDLC» و «Agile» رو توضیح بده تا نشون بدی کار تیمی بلدی. 🌐
مهمترین نکته: به جای حفظ کردن، درک عمیق داشته باش. وقتی مفاهیم رو بفهمی، اعتمادبهنفس خودتو نشون میدی. 🌟
حالا وقت اقدامه! یه مصاحبه تمرینی با یکی از دوستات ترتیب بده و استرس رو تبدیل به انرژی مثبت کن. 🔥
#Codeit #Android #Kotlin #Jetpack #InterviewPrep #TechCareer #Mindset #JobSearch
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
همیشه از مصاحبههای فنی استرس داری؟ 🤔
این حس برای همه آشناست؛ اما نگران نباش، راهکار داره. 📝
اولین نکته: «رزومه» تو خط مقدمه. اون رو بر اساس موقعیت شغلی هدف شخصیسازی کن. ✨
دوم: پروژهها رو عمیق بلد باش. تو مصاحبه ازت میپرسن چرا از «ViewModel» استفاده کردی یا چطور مشکل «همگامسازی» رو حل کردی. 🛠️
سوم: الگوریتم و ساختمان داده رو با تمرین مداوم روی «LeetCode» یا «HackerRank» قورت بده. هر روز ۱-۲ تا مسئله کافیه. 🧩
چهارم: انگلیسی رو تقویت کن. بیشتر مصاحبههای خوب به انگلیسی انجام میشن. با خودت توی آینه تمرین کن. 🗣️
پنجم: «SDLC» و «Agile» رو توضیح بده تا نشون بدی کار تیمی بلدی. 🌐
مهمترین نکته: به جای حفظ کردن، درک عمیق داشته باش. وقتی مفاهیم رو بفهمی، اعتمادبهنفس خودتو نشون میدی. 🌟
حالا وقت اقدامه! یه مصاحبه تمرینی با یکی از دوستات ترتیب بده و استرس رو تبدیل به انرژی مثبت کن. 🔥
#Codeit #Android #Kotlin #Jetpack #InterviewPrep #TechCareer #Mindset #JobSearch
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1
بچهها، وقتشه با دو تا از کاربردیترین اپراتورهای «Flow» آشنا بشیم؛ «catch» و «retry»! ⚡️
تا حالا شده «Flow» وسط کار خطا بده و کل برنامه کرش کنه؟ 😱 دقیقاً همین مشکل رو امروز حل میکنیم.
اپراتور «catch» خطاهای بالادست رو میگیره و نمیذاره برنامه از کار بیفته. اپراتور «retry» هم بعد از خطا، دوباره «Flow» رو اجرا میکنه. 🔄
فرض کن داری از سرور داده میگیری و ناگهان اینترنت قطع میشه. اینجا بهجای کرش کردن، با «retry» چند بار دیگه تلاش میکنیم تا اتصال برگرده. 🛡️
یه مثال عملی ببینیم:
کد بالا تا وقتی خطای موقت برطرف نشده، دوباره اجرا میشه. بعد از موفقیت، «Flow» مقدار نهایی رو صادر میکنه و اگه واقعاً وصل نشد، «catch» جلوی کرش رو میگیره. 🚀
نکته مهم: «catch» فقط خطاهای بالادست خودش رو میگیره، پس باید همیشه قبل از «collect» قرار بگیره. «retry» رو هم همیشه قبل از «catch» بذار. 📌
حالا میتونی «Flow»های مقاوم و بدون کرش بنویسی. این دو اپراتور رو هیچوقت فراموش نکن! 💪
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
تا حالا شده «Flow» وسط کار خطا بده و کل برنامه کرش کنه؟ 😱 دقیقاً همین مشکل رو امروز حل میکنیم.
اپراتور «catch» خطاهای بالادست رو میگیره و نمیذاره برنامه از کار بیفته. اپراتور «retry» هم بعد از خطا، دوباره «Flow» رو اجرا میکنه. 🔄
فرض کن داری از سرور داده میگیری و ناگهان اینترنت قطع میشه. اینجا بهجای کرش کردن، با «retry» چند بار دیگه تلاش میکنیم تا اتصال برگرده. 🛡️
یه مثال عملی ببینیم:
var attemptCount = 0
val dataFlow = flow {
attemptCount++
emit("تلاش: $attemptCount")
if (attemptCount < 3) throw IOException("خطای موقت")
emit("موفق شد ✅")
}.retryWhen { _, attempt ->
attempt < 3
}.catch { e ->
emit("خطا: ${e.message}")
}
کد بالا تا وقتی خطای موقت برطرف نشده، دوباره اجرا میشه. بعد از موفقیت، «Flow» مقدار نهایی رو صادر میکنه و اگه واقعاً وصل نشد، «catch» جلوی کرش رو میگیره. 🚀
نکته مهم: «catch» فقط خطاهای بالادست خودش رو میگیره، پس باید همیشه قبل از «collect» قرار بگیره. «retry» رو هم همیشه قبل از «catch» بذار. 📌
حالا میتونی «Flow»های مقاوم و بدون کرش بنویسی. این دو اپراتور رو هیچوقت فراموش نکن! 💪
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤3🔥1
🚀 «Flow» بخش یازدهم: اپراتور «flowOn» ⚡️
📌 وقتی یک «Flow» جمعآوری میکنی، همه عملیاتها توی یک «Context» اجرا میشن. اگه کار سنگین باشه، رابط کاربری از کار میافته!
🛠️ «flowOn» بهت اجازه میده قسمت بالای زنجیره رو به یک «Dispatcher» دیگه بفرستی؛ مثلاً «Dispatchers.Default».
🎯 یعنی فقط اپراتورهای قبل از «flowOn» روی اون رشته میافتن؛ بعد از اون و «collect» روی رشته اصلی میمونن.
📡 مثال واقعی: خوندن از دیتابیس یا شبکه، بعد نمایش نتیجه در «TextView».
👇 کد زیر رو ببین:
📖 اینجا کار سنگین «map» و خود «flow» روی «Dispatchers.Default» اجرا میشه، ولی «collect» روی «Main» مونده.
💰 اگه «flowOn» نداشته باشیم، کل کار روی «Main» انجام میشه و برنامه لگ میزنه.
⚠️ نکته: ترتیب «flowOn» مهمه؛ هر کدوم فقط روی بالاییهای خودش اثر داره.
💪 حالا خودت امتحان کن و ببین چقدر اجرا بهینهتر شده!
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #flowOn #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
📌 وقتی یک «Flow» جمعآوری میکنی، همه عملیاتها توی یک «Context» اجرا میشن. اگه کار سنگین باشه، رابط کاربری از کار میافته!
🛠️ «flowOn» بهت اجازه میده قسمت بالای زنجیره رو به یک «Dispatcher» دیگه بفرستی؛ مثلاً «Dispatchers.Default».
🎯 یعنی فقط اپراتورهای قبل از «flowOn» روی اون رشته میافتن؛ بعد از اون و «collect» روی رشته اصلی میمونن.
📡 مثال واقعی: خوندن از دیتابیس یا شبکه، بعد نمایش نتیجه در «TextView».
👇 کد زیر رو ببین:
val heavyFlow = flow {
repeat(3) {
delay(500)
emit("Item $it")
}
}.map { item ->
item.uppercase()
}.flowOn(Dispatchers.Default)
lifecycleScope.launch {
heavyFlow.collect { result ->
textView.text = result
}
}
📖 اینجا کار سنگین «map» و خود «flow» روی «Dispatchers.Default» اجرا میشه، ولی «collect» روی «Main» مونده.
💰 اگه «flowOn» نداشته باشیم، کل کار روی «Main» انجام میشه و برنامه لگ میزنه.
⚠️ نکته: ترتیب «flowOn» مهمه؛ هر کدوم فقط روی بالاییهای خودش اثر داره.
💪 حالا خودت امتحان کن و ببین چقدر اجرا بهینهتر شده!
#Codeit #Android #Kotlin #Jetpack #Flow #Coroutines #flowOn #KotlinCoroutines
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1
🚀 قسمت دوازدهم سری «Flow» رسید؛ اینبار با «StateFlow» میخوایم وضعیت «UI» رو هوشمندانه مدیریت کنیم. 💡
«StateFlow» برخلاف «Flow» معمولی همیشه یک مقدار داره و هر مشترک تازهوارد رو با آخرین مقدار مقداردهی میکنه. 🎯
📱 کاربرد واقعی: تعداد آیتمهای سبد خرید که همیشه باید آخرین مقدار رو نشون بده؛ دقیقاً برای همین ساخته شده.
بذار با یه مثال ساده از «ViewModel» شروع کنیم: 👇
✅ «MutableStateFlow» مقدار داخلی رو تغییر میده و «asStateFlow()» یه نمای فقطخواندنی میسازه؛ پس بیرون از کلاس هیچکس نمیتونه مقدار رو دستکاری کنه.
«StateFlow» مستقل از «Lifecycle» کار میکنه و با «collectAsState()» در «Jetpack Compose» بهسادگی ترکیب میشه. ⚡️
حالا وقتشه اولین «LiveData» پروژهات رو با «StateFlow» جایگزین کنی و تفاوت رو حس کنی. 🚀
#Codeit #Android #Kotlin #Jetpack #StateFlow #Flow #Coroutines #ViewModel
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
«StateFlow» برخلاف «Flow» معمولی همیشه یک مقدار داره و هر مشترک تازهوارد رو با آخرین مقدار مقداردهی میکنه. 🎯
📱 کاربرد واقعی: تعداد آیتمهای سبد خرید که همیشه باید آخرین مقدار رو نشون بده؛ دقیقاً برای همین ساخته شده.
بذار با یه مثال ساده از «ViewModel» شروع کنیم: 👇
class CounterViewModel : ViewModel() {
private val _count = MutableStateFlow(0)
val count = _count.asStateFlow()
fun increment() { _count.value++ }
}
✅ «MutableStateFlow» مقدار داخلی رو تغییر میده و «asStateFlow()» یه نمای فقطخواندنی میسازه؛ پس بیرون از کلاس هیچکس نمیتونه مقدار رو دستکاری کنه.
«StateFlow» مستقل از «Lifecycle» کار میکنه و با «collectAsState()» در «Jetpack Compose» بهسادگی ترکیب میشه. ⚡️
حالا وقتشه اولین «LiveData» پروژهات رو با «StateFlow» جایگزین کنی و تفاوت رو حس کنی. 🚀
#Codeit #Android #Kotlin #Jetpack #StateFlow #Flow #Coroutines #ViewModel
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1
🧠 یک توسعهدهنده خوب فقط کد مینویسد؛ اما یک توسعهدهنده برند، دیده میشود!
«Personal Brand» یعنی تصویری که دیگران با شنیدن اسم تو در ذهنشان میسازند. نه فقط رزومه، بلکه حضور تو در فضای دیجیتال است. 💼
۳ ستون اصلی برند شخصی:
۱️⃣ دانش: چیزی که بلدی و هر روز بهترش میکنی 📚
۲️⃣ نمایش: نشان دادن کارها و یادگیریهایت ✍️
۳️⃣ شبکه: ارتباط با آدمهایی که مسیرت را جلو میبرند 🤝
برای شروع لازم نیست حرفهای باشی. همین امروز یک «GitHub» مرتب بساز، تجربههایت را در «LinkedIn» بنویس و پروژههای کوچکت را منتشر کن. 🚀
مورد واقعی: یک برنامهنویس اندروید که هر هفته یک پست درباره «Kotlin» مینوشت، بعد از ۶ ماه پیشنهاد شغلی از چند شرکت معتبر گرفت؛ بدون اینکه رزومهای بفرستد! 📈
یادت باشد: برند شخصی یعنی اعتمادسازی قبل از درخواست شغل. آدمها اول به آدم اعتماد میکنند، بعد به مهارتش. 💡
پس از همین هفته یک قدم بردار: یک پست آموزشی بنویس یا یک پروژه منتشر کن. تکرار، برند تو را میسازد. 🔥
#Codeit #Android #Kotlin #Jetpack #PersonalBrand #CareerGrowth #DeveloperLife #GitHub
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
«Personal Brand» یعنی تصویری که دیگران با شنیدن اسم تو در ذهنشان میسازند. نه فقط رزومه، بلکه حضور تو در فضای دیجیتال است. 💼
۳ ستون اصلی برند شخصی:
۱️⃣ دانش: چیزی که بلدی و هر روز بهترش میکنی 📚
۲️⃣ نمایش: نشان دادن کارها و یادگیریهایت ✍️
۳️⃣ شبکه: ارتباط با آدمهایی که مسیرت را جلو میبرند 🤝
برای شروع لازم نیست حرفهای باشی. همین امروز یک «GitHub» مرتب بساز، تجربههایت را در «LinkedIn» بنویس و پروژههای کوچکت را منتشر کن. 🚀
مورد واقعی: یک برنامهنویس اندروید که هر هفته یک پست درباره «Kotlin» مینوشت، بعد از ۶ ماه پیشنهاد شغلی از چند شرکت معتبر گرفت؛ بدون اینکه رزومهای بفرستد! 📈
یادت باشد: برند شخصی یعنی اعتمادسازی قبل از درخواست شغل. آدمها اول به آدم اعتماد میکنند، بعد به مهارتش. 💡
پس از همین هفته یک قدم بردار: یک پست آموزشی بنویس یا یک پروژه منتشر کن. تکرار، برند تو را میسازد. 🔥
#Codeit #Android #Kotlin #Jetpack #PersonalBrand #CareerGrowth #DeveloperLife #GitHub
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1
🚀 قسمت ۱۳ از سری «Flow»؛ این بار «StateFlow» را در «ViewModel» بررسی میکنیم!
🔹 «StateFlow» یک «Hot Flow» است که همیشه آخرین مقدار را نگه میدارد؛ بهترین گزینه برای نگهداری state در «ViewModel».
💡 چرا بهجای «LiveData»؟
🔹 هماهنگی کامل با «Kotlin» و «Coroutines»
🔹 سازگاری مستقیم با «Jetpack Compose» بدون نیاز به کد اضافه
📱 کاربرد واقعی: نمایش وضعیت «Loading» و «Error» هنگام دریافت داده از «Repository».
کد زیر یک «ViewModel» عملی را نشان میدهد:
✅ «MutableStateFlow» خصوصی است و فقط نسخهی فقطخواندنی آن با «asStateFlow» بیرون داده میشود. تابع «update» تغییر state را اتمیک انجام میدهد.
💎 نکته طلایی: هرگز «MutableStateFlow» را مستقیم expose نکنید.
📌 جمعبندی: «StateFlow» یعنی state همیشه در دسترس، همیشه بهروز و کاملاً تستپذیر.
#Codeit #Android #Kotlin #Jetpack #Flow #StateFlow #ViewModel #Compose
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔹 «StateFlow» یک «Hot Flow» است که همیشه آخرین مقدار را نگه میدارد؛ بهترین گزینه برای نگهداری state در «ViewModel».
💡 چرا بهجای «LiveData»؟
🔹 هماهنگی کامل با «Kotlin» و «Coroutines»
🔹 سازگاری مستقیم با «Jetpack Compose» بدون نیاز به کد اضافه
📱 کاربرد واقعی: نمایش وضعیت «Loading» و «Error» هنگام دریافت داده از «Repository».
کد زیر یک «ViewModel» عملی را نشان میدهد:
data class User(val id: String, val name: String)
interface UserRepository {
suspend fun getUser(): User
}
data class UserUiState(
val isLoading: Boolean = false,
val error: String? = null,
val user: User? = null
)
class UserViewModel(
private val repository: UserRepository
) : ViewModel() {
private val _uiState = MutableStateFlow(UserUiState())
val uiState: StateFlow<UserUiState> = _uiState.asStateFlow()
fun loadUser() {
viewModelScope.launch {
_uiState.update { it.copy(isLoading = true) }
try {
val user = repository.getUser()
_uiState.update { it.copy(isLoading = false, user = user) }
} catch (e: Exception) {
_uiState.update { it.copy(isLoading = false, error = e.message) }
}
}
}
}
✅ «MutableStateFlow» خصوصی است و فقط نسخهی فقطخواندنی آن با «asStateFlow» بیرون داده میشود. تابع «update» تغییر state را اتمیک انجام میدهد.
💎 نکته طلایی: هرگز «MutableStateFlow» را مستقیم expose نکنید.
📌 جمعبندی: «StateFlow» یعنی state همیشه در دسترس، همیشه بهروز و کاملاً تستپذیر.
#Codeit #Android #Kotlin #Jetpack #Flow #StateFlow #ViewModel #Compose
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤3🔥1
«SharedFlow» برخلاف «StateFlow» برای ارسال رویدادهای یکبارمصرف ساخته شده! 🚀
تو «ViewModel» برای اتفاقهایی مثل نمایش پیام یا ناوبری نباید از «StateFlow» استفاده کنی؛ چون مقدار قبلی رو دوباره به مشترک جدید تحویل میده. 😬
«SharedFlow» فقط به مشترکهای فعال ارسال میکنه و هیچ مقدار قبلیای رو نگه نمیداره. ✅
کاربرد واقعی: بعد از زدن دکمه ثبتنام، فقط یکبار باید پیام «موفقیت» نمایش داده بشه، نه هر بار که به صفحه برمیگردی. 🎯
یک نمونه ساده از تعریف «SharedFlow» در «ViewModel»:
این کد رویداد رو فقط به شنوندههای فعال میفرسته؛ اگه مشترکی وجود نداشته باشه، رویداد از بین میره. «extraBufferCapacity» هم باعث میشه اگه مشترک در حال پردازش بود، یک رویداد در بافر بمونه. 📦
نکته مهم: برای «Event» ها از «SharedFlow» و برای «State» ها از «StateFlow» استفاده کن. 🧠
#Codeit #Android #Kotlin #Jetpack #SharedFlow #Coroutines #Flow #CleanArchitecture
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
تو «ViewModel» برای اتفاقهایی مثل نمایش پیام یا ناوبری نباید از «StateFlow» استفاده کنی؛ چون مقدار قبلی رو دوباره به مشترک جدید تحویل میده. 😬
«SharedFlow» فقط به مشترکهای فعال ارسال میکنه و هیچ مقدار قبلیای رو نگه نمیداره. ✅
کاربرد واقعی: بعد از زدن دکمه ثبتنام، فقط یکبار باید پیام «موفقیت» نمایش داده بشه، نه هر بار که به صفحه برمیگردی. 🎯
یک نمونه ساده از تعریف «SharedFlow» در «ViewModel»:
class MainViewModel : ViewModel() {
private val _events = MutableSharedFlow<String>(extraBufferCapacity = 1)
val events = _events.asSharedFlow()
fun onSaveClick() {
viewModelScope.launch {
_events.emit("ذخیره شد")
}
}
}
این کد رویداد رو فقط به شنوندههای فعال میفرسته؛ اگه مشترکی وجود نداشته باشه، رویداد از بین میره. «extraBufferCapacity» هم باعث میشه اگه مشترک در حال پردازش بود، یک رویداد در بافر بمونه. 📦
نکته مهم: برای «Event» ها از «SharedFlow» و برای «State» ها از «StateFlow» استفاده کن. 🧠
#Codeit #Android #Kotlin #Jetpack #SharedFlow #Coroutines #Flow #CleanArchitecture
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1
🔥 «Flow» فقط ابزار انتشار داده نیست؛ اگر اصولش رو رعایت نکنی، باعث نشت حافظه و مصرف بیدلیل منابع میشه!
ما رسیدیم به قسمت پانزدهم: «Flow Best Practices»؛ جایی که تئوری تموم میشه و بحث سر کدنویسی واقعی و بهینهست. 🚀
🚫 اشتباه رایج: جمعآوری مستقیم «Flow» در «ViewModel» بدون مدیریت چرخه حیات. این کار باعث میشه «Coroutine» همیشه زنده بمونه و «Bundle» هرگز آزاد نشه.
✅ راهکار درست: تبدیل «Flow» به «StateFlow» با استفاده از «stateIn» و مشخص کردن زمان شروع. توی «Jetpack Compose» هم باید با «repeatOnLifecycle» جمعآوری بشه تا فقط وقتی UI فعاله، داده بیاد.
فرض کن یک «ViewModel» داری که وضعیت صفحه رو از مخزن میگیره:
کد بالا سه تا «Best Practice» رو رعایت میکنه: تبدیل به «StateFlow»، مدیریت خطا با «catch» و شروع فقط وقتی مشتری فعاله.
حالا توی «Compose» هم بهجای جمعآوری مستقیم، از این الگو استفاده کن:
با «collectAsStateWithLifecycle» مطمئن میشی جمعآوری فقط توی پسزمینه فعاله و با رفتن به پسزمینه، کارگر اضافه انجام نمیشه. 🧠
نکته بعدی: اگر دادهها تکراری هستن، حتماً از «distinctUntilChanged» استفاده کن تا فقط با تغییر مقدار، «Recomposition» اتفاق بیفته. برای رویدادهای سریع هم «conflate» رو فراموش نکن. ⚡
جمعبندی: «Flow» قدرتمنده، اما قدرت واقعیش توی پایبندی به اصول استفادهست. این ۳ عادت رو جدی بگیر: «stateIn» با «WhileSubscribed» در «ViewModel»، جمعآوری با «repeatOnLifecycle» و کاهش نویز با «distinctUntilChanged». 🎯
#Codeit #Android #Kotlin #Jetpack #Flow #StateFlow #BestPractices
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
ما رسیدیم به قسمت پانزدهم: «Flow Best Practices»؛ جایی که تئوری تموم میشه و بحث سر کدنویسی واقعی و بهینهست. 🚀
🚫 اشتباه رایج: جمعآوری مستقیم «Flow» در «ViewModel» بدون مدیریت چرخه حیات. این کار باعث میشه «Coroutine» همیشه زنده بمونه و «Bundle» هرگز آزاد نشه.
✅ راهکار درست: تبدیل «Flow» به «StateFlow» با استفاده از «stateIn» و مشخص کردن زمان شروع. توی «Jetpack Compose» هم باید با «repeatOnLifecycle» جمعآوری بشه تا فقط وقتی UI فعاله، داده بیاد.
فرض کن یک «ViewModel» داری که وضعیت صفحه رو از مخزن میگیره:
class MainViewModel(
private val repository: Repository
) : ViewModel() {
val uiState: StateFlow<UiState> = repository
.latestNews
.map { news -> UiState.Success(news) }
.catch { error -> emit(UiState.Error(error.message)) }
.stateIn(
scope = viewModelScope,
started = WhileSubscribed(5_000),
initialValue = UiState.Loading
)
}
کد بالا سه تا «Best Practice» رو رعایت میکنه: تبدیل به «StateFlow»، مدیریت خطا با «catch» و شروع فقط وقتی مشتری فعاله.
حالا توی «Compose» هم بهجای جمعآوری مستقیم، از این الگو استفاده کن:
@Composable
fun MainScreen(viewModel: MainViewModel) {
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
// now render based on uiState
}
با «collectAsStateWithLifecycle» مطمئن میشی جمعآوری فقط توی پسزمینه فعاله و با رفتن به پسزمینه، کارگر اضافه انجام نمیشه. 🧠
نکته بعدی: اگر دادهها تکراری هستن، حتماً از «distinctUntilChanged» استفاده کن تا فقط با تغییر مقدار، «Recomposition» اتفاق بیفته. برای رویدادهای سریع هم «conflate» رو فراموش نکن. ⚡
جمعبندی: «Flow» قدرتمنده، اما قدرت واقعیش توی پایبندی به اصول استفادهست. این ۳ عادت رو جدی بگیر: «stateIn» با «WhileSubscribed» در «ViewModel»، جمعآوری با «repeatOnLifecycle» و کاهش نویز با «distinctUntilChanged». 🎯
#Codeit #Android #Kotlin #Jetpack #Flow #StateFlow #BestPractices
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1
🧘♂️ ساعت ۲ نصفه شب، صفحه مونیتور زل زدی به یه خط کد که داری کرش میکنه و هیچ دلیل منطقی هم نمیبینی؟
🔍 آروم باش. دقیقا همین لحظه ست که یه «Developer» حرفهای رو از یه مبتدی جدا میکنه.
🛠 «Debugging» فقط پیدا کردن باگ نیست؛ مدیریت ذهنیه که باید با یه مشکل ناشناخته روبهرو بشه.
🚶 اول از همه از پشت سیستم بلند شو. ۱۰ دقیقه راه برو. مغزت موقع حرکت، الگوهای بهتری پیدا میکنه.
📝 بعد، باگ رو دقیقا بنویس: چی انتظار داشتی؟ چی اتفاق افتاد؟ چه ورودیهایی دادی؟
💡 این همون تکنیک معروف «Rubber Duck Debugging» است؛ مشکل رو برای یه آدم خیالی توضیح بده تا اشکال خودش رو نشون بده.
✨ قانون طلایی: هیچوقت با ذهن خسته تغییرات بزرگ نده. یه «Log» اضافه کن، یه «Breakpoint» بذار و کوچیککوچیک پیش برو.
🧠 یادت باشه: هر باگ یه فرصت یادگیریه. هر دقیقهای که دنبال علت میگردی، تجربهات داره عمیقتر میشه.
🔁 اگه ۳۰ دقیقهست گیر کردی، رهاش کن و برو چیز دیگهای انجام بده. مغز تو ناخودآگاه هنوز داره روش کار میکنه.
🤝 قبل از اینکه توی «Stack Overflow» دنبال جواب بگردی، مطمئن شو که مشکلت رو کامل شبیهسازی کردهای.
🎯 نتیجه؟ با آرامش، باگها نصفِ زمان حل میشن. عصبانیت فقط سرعتتو کم میکنه و کلی خطای جدید هم میسازه.
🚀 پس دفعه بعد که باگ دیدی، لبخند بزن؛ این یعنی داری یه چیز جدید یاد میگیری.
#Codeit #Android #Kotlin #Jetpack #Debugging #DeveloperMindset #ProblemSolving #StayCalm
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔍 آروم باش. دقیقا همین لحظه ست که یه «Developer» حرفهای رو از یه مبتدی جدا میکنه.
🛠 «Debugging» فقط پیدا کردن باگ نیست؛ مدیریت ذهنیه که باید با یه مشکل ناشناخته روبهرو بشه.
🚶 اول از همه از پشت سیستم بلند شو. ۱۰ دقیقه راه برو. مغزت موقع حرکت، الگوهای بهتری پیدا میکنه.
📝 بعد، باگ رو دقیقا بنویس: چی انتظار داشتی؟ چی اتفاق افتاد؟ چه ورودیهایی دادی؟
💡 این همون تکنیک معروف «Rubber Duck Debugging» است؛ مشکل رو برای یه آدم خیالی توضیح بده تا اشکال خودش رو نشون بده.
✨ قانون طلایی: هیچوقت با ذهن خسته تغییرات بزرگ نده. یه «Log» اضافه کن، یه «Breakpoint» بذار و کوچیککوچیک پیش برو.
🧠 یادت باشه: هر باگ یه فرصت یادگیریه. هر دقیقهای که دنبال علت میگردی، تجربهات داره عمیقتر میشه.
🔁 اگه ۳۰ دقیقهست گیر کردی، رهاش کن و برو چیز دیگهای انجام بده. مغز تو ناخودآگاه هنوز داره روش کار میکنه.
🤝 قبل از اینکه توی «Stack Overflow» دنبال جواب بگردی، مطمئن شو که مشکلت رو کامل شبیهسازی کردهای.
🎯 نتیجه؟ با آرامش، باگها نصفِ زمان حل میشن. عصبانیت فقط سرعتتو کم میکنه و کلی خطای جدید هم میسازه.
🚀 پس دفعه بعد که باگ دیدی، لبخند بزن؛ این یعنی داری یه چیز جدید یاد میگیری.
#Codeit #Android #Kotlin #Jetpack #Debugging #DeveloperMindset #ProblemSolving #StayCalm
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1
🎯 آموزش Jetpack Compose — قسمت اول: کامپوز چیه؟
کار ساخت UI توی اندروید تا چند سال پیش فقط با XML بود. ديگه لازم نیست با findViewById و LayoutInflater درگیر بشی.
«Jetpack Compose» یه تولدباکس مدرن از گوگله که بهت اجازه میده با نوشتن کد «Kotlin» کل UI رو بسازی. بدون XML، بدون دردسر.
📌 فرق اصلیش اینه: UI بهصورت «Declarative» نوشته میشه. یعنی میگی «چی میخوام ببینم»، نه «چطور ببینم». این طرز فکر، کد رو خواناتر و نگهداریش رو سادهتر میکنه.
💡 مثال واقعی: فرض کن یه دکمه داری. توی XML باید layout و onclick رو جدا مدیریت کنی. توی کامپوز، همه چیز یه تابع سادهست.
بیایم با هم یه «Text» ساده توی کامپوز بسازیم:
🧠 این کد چیکار میکنه؟ کافیه تابع رو با «@Composable» مشخص کنی. بعدش هرچی توش بنویسی، مستقیم توی UI نشون داده میشه. اینجا یه متن آبی با سایز ۲۴ نوشتیم.
✨ مزیت کلیدی: کامپوز بهت قدرت میده که بخشهای UI رو به قطعات کوچک و قابل استفاده مجدد تقسیم کنی. مثل لگو ولی با کد!
✅ از همین امروز شروع کن. در قسمت بعدی میرسیم به «State» و مدیریتش.
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #AndroidDevelopment #Compose #Beginner
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
کار ساخت UI توی اندروید تا چند سال پیش فقط با XML بود. ديگه لازم نیست با findViewById و LayoutInflater درگیر بشی.
«Jetpack Compose» یه تولدباکس مدرن از گوگله که بهت اجازه میده با نوشتن کد «Kotlin» کل UI رو بسازی. بدون XML، بدون دردسر.
📌 فرق اصلیش اینه: UI بهصورت «Declarative» نوشته میشه. یعنی میگی «چی میخوام ببینم»، نه «چطور ببینم». این طرز فکر، کد رو خواناتر و نگهداریش رو سادهتر میکنه.
💡 مثال واقعی: فرض کن یه دکمه داری. توی XML باید layout و onclick رو جدا مدیریت کنی. توی کامپوز، همه چیز یه تابع سادهست.
بیایم با هم یه «Text» ساده توی کامپوز بسازیم:
@Composable
fun HelloWorld() {
Text(
text = "سلام دنیا!",
color = Color.Blue,
fontSize = 24.sp
)
}
🧠 این کد چیکار میکنه؟ کافیه تابع رو با «@Composable» مشخص کنی. بعدش هرچی توش بنویسی، مستقیم توی UI نشون داده میشه. اینجا یه متن آبی با سایز ۲۴ نوشتیم.
✨ مزیت کلیدی: کامپوز بهت قدرت میده که بخشهای UI رو به قطعات کوچک و قابل استفاده مجدد تقسیم کنی. مثل لگو ولی با کد!
✅ از همین امروز شروع کن. در قسمت بعدی میرسیم به «State» و مدیریتش.
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #AndroidDevelopment #Compose #Beginner
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1
🗂 «Jetpack Compose» قدم اولت رو برداشتی؟ حالا وقتشه با قلب این فریمورک آشنا بشی: «Composable functions»!
🧠 هر «Composable function» یه تابع معمولی «Kotlin» هست که با افزودن «@Composable» بهش، میتونه رابط کاربری بسازه. بدونش هم میتونی کد بزنی، ولی با «@Composable» معجزه میکنه.
🔧 چرا بهش نیاز داری؟ چون با «Composable»ها میتونی UI رو به صورت تابعی و بدون دردسر مدیریت کنی. هر بار که وضعیت (state) تغییر کنه، فقط همون بخش لازم دوباره رندر میشه.
📱 مثال واقعی: فرض کن یک صفحه ساده داری که اسم کاربر رو نشون میده. با «Composable» این کار رو خیلی راحت انجام میدی:
✅ این کد یه تابع «Composable» به اسم «Greeting» میسازه که یک «Text» رو با اسم ورودی نشون میده. با تغییر اسم، فقط همین متن دوباره ساخته میشه و بقیه UI دست نمیخوره.
💡 نکته مهم: تو «Composable»ها خبری از «return» نیست. تو فقط میگی چی نشون بده، و «Compose» خودش بقیه کار رو میکنه.
🔗 حالا بیا این «Greeting» رو داخل یه «Activity» صدا بزنیم:
توضیح: «setContent» یه «block» از «Composable»ها رو به عنوان ریشه UI معرفی میکنه. اینجا «Greeting» رو صدا زدیم تا متن خوشآمدگویی نمایش داده بشه.
💎 جمعبندی: «Composable function»ها پایهترین مفاهیم «Jetpack Compose» هستن. هر UI که میسازی، در نهایت از این توابع تشکیل میشه. پس خوب یادشون بگیر.
#Codeit #Android #Kotlin #Jetpack #Compose #Composable #UI #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🧠 هر «Composable function» یه تابع معمولی «Kotlin» هست که با افزودن «@Composable» بهش، میتونه رابط کاربری بسازه. بدونش هم میتونی کد بزنی، ولی با «@Composable» معجزه میکنه.
🔧 چرا بهش نیاز داری؟ چون با «Composable»ها میتونی UI رو به صورت تابعی و بدون دردسر مدیریت کنی. هر بار که وضعیت (state) تغییر کنه، فقط همون بخش لازم دوباره رندر میشه.
📱 مثال واقعی: فرض کن یک صفحه ساده داری که اسم کاربر رو نشون میده. با «Composable» این کار رو خیلی راحت انجام میدی:
@Composable
fun Greeting(name: String) {
Text(text = "سلام $name!", fontSize = 24.sp)
}
✅ این کد یه تابع «Composable» به اسم «Greeting» میسازه که یک «Text» رو با اسم ورودی نشون میده. با تغییر اسم، فقط همین متن دوباره ساخته میشه و بقیه UI دست نمیخوره.
💡 نکته مهم: تو «Composable»ها خبری از «return» نیست. تو فقط میگی چی نشون بده، و «Compose» خودش بقیه کار رو میکنه.
🔗 حالا بیا این «Greeting» رو داخل یه «Activity» صدا بزنیم:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
Greeting(name = "کاربر جان!")
}
}
توضیح: «setContent» یه «block» از «Composable»ها رو به عنوان ریشه UI معرفی میکنه. اینجا «Greeting» رو صدا زدیم تا متن خوشآمدگویی نمایش داده بشه.
💎 جمعبندی: «Composable function»ها پایهترین مفاهیم «Jetpack Compose» هستن. هر UI که میسازی، در نهایت از این توابع تشکیل میشه. پس خوب یادشون بگیر.
#Codeit #Android #Kotlin #Jetpack #Compose #Composable #UI #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤3🥰1
🎯 «Modifier» مهمترین ابزار شخصیسازی در «Jetpack Compose» است؛ بدون آن فقط یک صفحه خالی دارید!
🛠 «Modifier» مثل یک جعبه ابزار میماند که میتوانید روی هر «Composable» اعمال کنید.
📏 با آن فاصله، رنگ، کلیک، چرخش، اندازه و صدها ویژگی دیگر را تنظیم میکنید.
🔗 نکته طلایی: «Modifier» ها زنجیرهای میشوند؛ ترتیب آنها در نتیجه نهایی تأثیر مستقیم دارد.
📰 مثال واقعی: یک کارت خبری که پسزمینه دارد، قابل کلیک است و دورتادور آن فاصله گذاشتهایم.
کد زیر را ببینید:
🧠 این کد ابتدا ۱۶ واحد فاصله بیرونی میگذارد، بعد عرض را کامل میکند و رنگ پسزمینه را روشن میسازد.
👆 سپس کامپوننت را قابل کلیک کرده و در نهایت ۸ واحد فاصله داخلی به محتوا میدهد.
⚠️ نکته مهم: اگر ترتیب «background» و «clickable» را عوض کنید، افکت کلیک زیر رنگ قرار میگیرد!
✍️ تمرین: همین مسیر را روی یک «Image» هم امتحان کنید و نتیجه را ببینید.
💪 با تکرار این الگو، بدنه «Modifier» برایتان کاملاً عادی میشود.
#Codeit #Android #Kotlin #Jetpack #Compose #Modifier #Programming #Learn
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🛠 «Modifier» مثل یک جعبه ابزار میماند که میتوانید روی هر «Composable» اعمال کنید.
📏 با آن فاصله، رنگ، کلیک، چرخش، اندازه و صدها ویژگی دیگر را تنظیم میکنید.
🔗 نکته طلایی: «Modifier» ها زنجیرهای میشوند؛ ترتیب آنها در نتیجه نهایی تأثیر مستقیم دارد.
📰 مثال واقعی: یک کارت خبری که پسزمینه دارد، قابل کلیک است و دورتادور آن فاصله گذاشتهایم.
کد زیر را ببینید:
Column(
modifier = Modifier
.padding(16.dp)
.fillMaxWidth()
.background(Color.LightGray)
.clickable { openArticle() }
.padding(8.dp)
) {
Text(text = "Hello Codeit! 📰")
}
🧠 این کد ابتدا ۱۶ واحد فاصله بیرونی میگذارد، بعد عرض را کامل میکند و رنگ پسزمینه را روشن میسازد.
👆 سپس کامپوننت را قابل کلیک کرده و در نهایت ۸ واحد فاصله داخلی به محتوا میدهد.
⚠️ نکته مهم: اگر ترتیب «background» و «clickable» را عوض کنید، افکت کلیک زیر رنگ قرار میگیرد!
✍️ تمرین: همین مسیر را روی یک «Image» هم امتحان کنید و نتیجه را ببینید.
💪 با تکرار این الگو، بدنه «Modifier» برایتان کاملاً عادی میشود.
#Codeit #Android #Kotlin #Jetpack #Compose #Modifier #Programming #Learn
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
❤2🔥1🥰1