Codeit Mobile
94 subscribers
3 photos
1 video
243 links
📱 آموزش برنامه‌نویسی موبایل

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
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
1🔥1🥰1👏1
سلام رفیق شغلی! 🚀

همیشه از مصاحبه‌های فنی استرس داری؟ 🤔

این حس برای همه آشناست؛ اما نگران نباش، راهکار داره. 📝

اولین نکته: «رزومه» تو خط مقدمه. اون رو بر اساس موقعیت شغلی هدف شخصی‌سازی کن.

دوم: پروژه‌ها رو عمیق بلد باش. تو مصاحبه ازت می‌پرسن چرا از «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» چند بار دیگه تلاش میکنیم تا اتصال برگرده. 🛡️

یه مثال عملی ببینیم:

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».
👇 کد زیر رو ببین:

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» شروع کنیم: 👇

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
2🔥1🥰1
🚀 قسمت ۱۳ از سری «Flow»؛ این بار «StateFlow» را در «ViewModel» بررسی میکنیم!

🔹 «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»:

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» داری که وضعیت صفحه رو از مخزن می‌گیره:

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
2🔥1🥰1
🎯 آموزش Jetpack Compose — قسمت اول: کامپوز چیه؟

کار ساخت 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
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» ها زنجیرهای میشوند؛ ترتیب آنها در نتیجه نهایی تأثیر مستقیم دارد.
📰 مثال واقعی: یک کارت خبری که پسزمینه دارد، قابل کلیک است و دورتادور آن فاصله گذاشتهایم.
کد زیر را ببینید:

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
یادگیری بدون ساختن مثل خوندن کتاب رانندگی بدون نشستن پشت فرمونه!

📚 خیلی از برنامه‌نویس‌ها ماه‌ها توی «Tutorial Hell» گیر می‌افتند—همش آموزش می‌بینن ولی هیچی نمی‌سازن.
⚖️ راز موفقیت توازن بین یادگیری و ساختن محصول واقعیه.

🔹 توی مسیر اندروید، تئوری بی‌عمل باعث فرسودگی ذهنی و ناامیدی میشه.
🔹 ساختن بی‌یادگیری هم باعث تولید کدهای ضعیف و «Anti‑Pattern»های خطرناک میشه.

راهکار عملی: قانون ۲۰/۸۰ رو امتحان کن.
۲۰٪ وقتت رو صرف یادگیری یه مفهوم جدید مثل «StateFlow» بکن،
۸۰٪ باقی‌مونده رو برو توی یه پروژه‌ی واقعی ازش استفاده کن.

📱 مثلاً:
یه «To‑Do App» ساده با «Room Database» و «ViewModel» بساز، بعد برو سراغ آموزش «Clean Architecture».
تجربه‌ی مستقیم باعث میشه مفاهیم عمیق‌تر توی ذهنت بمونن.

💡 اگر بعد از سه روز آموزش هنوز هیچ خط کدی ننوشتی، یعنی داری اشتباه می‌کنی.
یادگیری رو با ساختن گره بزن.

#Codeit #Android #Kotlin #Jetpack #DeveloperMindset #GrowthMindset #Balance #LearnByBuilding
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2🔥1🥰1
📱 «Text composable» در «Jetpack Compose» ساده‌ترین و در عین حال قدرتمندترین ابزار نمایش متن است.
اگر می‌خواهید متن‌های زیبا، حرفه‌ای و قابل تنظیم در اپلیکیشن «Android» داشته باشید، باید با این کامپوننت آشنا شوید.

🧩 «Text composable» یک تابع «Composable» است که رشته متنی را دریافت کرده و روی صفحه نمایش می‌دهد.
از تنظیم سایز و رنگ گرفته تا فونت و ترازبندی، همه چیز با پارامترهای ساده قابل کنترل است.

📌 کاربرد واقعی: نمایش نام کاربر، عنوان صفحه، توضیحات محصول، یا هر متنی که نیاز به استایل‌دهی داشته باشد.

💻 بیایید یک مثال ساده ببینیم:

@Composable
fun GreetingText(name: String) {
Text(
text = "سلام، $name",
fontSize = 24.sp,
color = Color.Blue,
fontWeight = FontWeight.Bold,
textAlign = TextAlign.Center,
modifier = Modifier.fillMaxWidth().padding(16.dp)
)
}


🔍 توضیح کد:
- «text»: متن اصلی را مشخص می‌کند.
- «fontSize»، «color»، «fontWeight»: ظاهر متن را تنظیم می‌کنند.
- «textAlign»: تراز متن را تعیین می‌کند.
- «modifier»: با «fillMaxWidth» عرض کامل و با «padding» فاصله داخلی اضافه می‌کند.

نکته کاربردی: برای استایل‌دهی حرفه‌ای‌تر می‌توانید از «MaterialTheme.typography» استفاده کنید تا فونت‌های استاندارد پروژه را اعمال کنید.

---

#Codeit #Android #Kotlin #Jetpack #JetpackCompose #TextComposable #UI #MobileDev
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1🥰1
🎯 «Jetpack Compose» قسمت ۵: «Button Composable»
یکی از پایهای‌ترین کامپوننت‌های UI در «Jetpack Compose» دکمه‌ها هستند.
بیایید ببینیم چطور می‌تونیم یک دکمه با ظاهر و رفتار دلخواه بسازیم.

🚀 مثال عملی:
فرض کنید یک دکمه «ثبت نام» می‌خواهید که با کلیک روی آن، یک پیام نمایش بدهد.

🛠️ کد ساده برای شروع:
@Composable
fun SimpleButton() {
Button(
onClick = {
println("دکمه کلیک شد!")
},
colors = ButtonDefaults.buttonColors(
containerColor = Color.Blue,
contentColor = Color.White
),
shape = RoundedCornerShape(12.dp)
) {
Text(text = "ثبت نام")
}
}

💡 توضیح:
- onClick: عملی است که بعد از کلیک اجرا می‌شه.
- colors: رنگ پس‌زمینه و متن رو مشخص می‌کنه.
- shape: گوشه‌های دکمه رو گرد می‌کنه (مثلاً ۱۲ پیکسل).

🎨 شخصی‌سازی بیشتر:
می‌تونید Modifier اضافه کنید تا اندازه، حاشیه یا ارتفاع دکمه رو تنظیم کنید:

Button(
onClick = { /* کلیک */ },
modifier = Modifier
.fillMaxWidth()
.height(56.dp)
.padding(horizontal = 16.dp)
) {
Text("ورود به حساب")
}

📌 کاربرد:
این کد یک دکمه تمام‌عرض با ارتفاع ثابت و فاصله از کناره‌ها می‌سازه.

نتیجه‌گیری:
با «Button» در «Jetpack Compose» می‌تونید دکمه‌های زیبا و واکنش‌گرا با کمترین کد بسازید.

#Codeit #Android #Kotlin #Jetpack #JetpackCompose #UI #Button #AndroidDev

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1🥰1
🎯 قسمت ششم از سری «Jetpack Compose»: آموزش «Image Composable» 🖼️

گاهی اوقات ساده‌ترین کارها مثل نمایش یک تصویر، در برنامه‌نویسی اندروید کلی دردسر دارد. اما در «Jetpack Compose» با «Image Composable» همه چیز راحت و تمیز می‌شود.

🔹 «Image» یک کامپوننت آماده است که هر نوع تصویری را در «Compose» نمایش می‌دهد.
🔹 برای استفاده از آن فقط باید منبع تصویر (مثلاً یک «drawable resource») را مشخص کنید.
🔹 اگر تصویر از اینترنت باشد، از کتابخانه‌های «Coil» یا «Glide» همراه با «rememberAsyncImagePainter» کمک می‌گیرید.

یک مثال ساده: نمایش تصویر از پوشه «res/drawable»:

@Composable
fun ShowImage() {
Image(
painter = painterResource(id = R.drawable.sample_image),
contentDescription = "تصویر نمونه",
modifier = Modifier
.fillMaxWidth()
.height(200.dp),
contentScale = ContentScale.Crop
)
}


📌 در این کد از «painterResource» برای بارگذاری تصویر داخلی استفاده شده.
📌 «contentDescription» برای دسترسی‌پذیری (Accessibility) ضروری است.
📌 «contentScale» نحوه تطبیق تصویر با فضا را مشخص می‌کند (مثلاً «Crop» برای برش).

💡 کاربردی: اگر تصویر پروفایل کاربر یا بنر تبلیغاتی دارید، با این روش به راحتی نمایش می‌دهید.
«Image Composable» انعطاف‌پذیر و سریع است – حتی انیمیشن و تغییر اندازه هم آسان.

#Codeit #Android #Kotlin #Jetpack #JetpackCompose #ImageComposable #AndroidDev #ComposeUI
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2🔥1
🎯 چرا «ثبات قدم» از «استعداد» در برنامه‌نویسی مهم‌تر است؟

خیلی‌ها فکر می‌کنند برنامه‌نویس شدن نیاز به نابغه بودن داره. اما واقعیت چیز دیگه‌ای هست.

در دنیای واقعی، برنامه‌نویسی یک مهارت عملی است، نه یک آزمون هوش. مثل یادگیری رانندگی یا آشپزی، هر روز تمرین کنی جلو می‌ری. 🏃‍♂️

تازه‌کارها اشتباه می‌کنند:
روزی ۸ ساعت کدنویسی، بعد یک هفته خستگی و ترک
روزی ۳۰ دقیقه کدنویسی منظم، برای یک سال کامل

ثبات یعنی حتی وقتی حوصله نداری، بنشینی و یک خط کد بزنی. این عادت تو رو از ۹۰ درصد بقیه جدا می‌کنه. 💪

در دنیای واقعی، کارفرماها دنبال کسی هستند که پروژه رو تموم کنه، نه کسی که الگوریتم‌های پیچیده رو از حفظ باشه.

تجربه شخصی: خیلی از برنامه‌نویسان موفق نه استعداد خاصی داشتند، نه ضریب هوشی بالا. فقط هر روز پای کد نشستند. 📈

توصیه عملی:
یک چالش ۳۰ روزه برای خودت تعریف کن. هر روز یک قطعه کد کوچک بنویس. حتی اگه ۵ خط باشه. بعد از یک ماه نتیجه رو می‌بینی. 🎯

این رو همیشه یادت باشه:
استعداد شروع خوبی است، اما «ثبات قدم» تو رو به خط پایان می‌رسونه. 🏁

#Codeit #Android #Kotlin #Jetpack #Consistency #Mindset #Programming #Growth

🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
🔥21
📱 «Jetpack Compose» Part 7: «Column» و «Row»
دو تا از مهم‌ترین ابزارهای چیدمان در «Compose» رو یاد می‌گیریم.

🧱 «Column» همه چیز رو به صورت عمودی زیر هم می‌چینه.
➡️ «Row» همه چیز رو به صورت افقی کنار هم می‌چینه.

🔧 مثال واقعی: فرض کن می‌خوای یه کارت کاربر بسازی که اسم و دکمه‌ها رو کنار هم داشته باشه.

📝 کد ساده برای شروع:

@Composable
fun UserCard() {
Column {
Text("نام کاربری: علی")
Row {
Button(onClick = { /* ویرایش */ }) {
Text("ویرایش")
}
Button(onClick = { /* حذف */ }) {
Text("حذف")
}
}
}
}


🔍 توضیح:
- «Column» بیرونی اسم کاربر رو بالا می‌ذاره و دکمه‌ها رو زیرش.
- «Row» داخلی دو دکمه رو کنار هم قرار می‌ده.

💡 نکته کاربردی:
از «Column» برای لیست‌های عمودی و از «Row» برای نوار ابزار یا دکمه‌های کنار هم استفاده کن.

#Codeit #Android #Kotlin #Jetpack #JetpackCompose #UI #Layout
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1🥰1
📦 «Box» در «Jetpack Compose» ساده‌ترین راه برای لایه‌بندی ویجت‌ها روی هم است.
👨‍💻 وقتی می‌خواهید یک متن را روی تصویر بگذارید یا یک دکمه را در گوشه‌ی کارت قرار دهید، «Box» بهترین انتخاب است.
🔍 «Box» یک «Layout» است که فرزندانش را به‌ترتیب روی هم می‌چیند و هر کدام می‌توانند موقعیت متفاوتی داشته باشند.

💡 مثال واقعی: یک کارت با عکس پس‌زمینه و متن روی آن.

کد زیر را ببینید:

Box(
modifier = Modifier
.fillMaxWidth()
.height(200.dp)
) {
Image(
painter = painterResource(id = R.drawable.background),
contentDescription = null,
modifier = Modifier.fillMaxSize(),
contentScale = ContentScale.Crop
)
Text(
text = "عنوان کارت",
color = Color.White,
fontSize = 24.sp,
modifier = Modifier
.align(Alignment.BottomCenter)
.padding(16.dp)
)
}


در این کد، «Image» تمام فضای «Box» را پر می‌کند و «Text» با استفاده از «align» به پایین و وسط چسبانده شده است.
🎯 «Box» هم‌چنین برای نمایش «CircularProgressIndicator» روی یک محتوا یا قرار دادن نشانگر «Badge» روی آیکون کاربرد دارد.

📌 نکته: از «Modifier.align» برای تعیین موقعیت دقیق هر فرزند استفاده کنید.
🌐 «Box» را به‌عنوان پایه‌ای برای «Stack» در «XML» به خاطر بسپارید.

#Codeit #Android #Kotlin #Jetpack #JetpackCompose #BoxLayout #UI #AndroidDev
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1🥰1
📐 چیدمان دقیق در «Jetpack Compose» بدون «Spacer» و «Divider» کامل نیست!
این دو ابزار ساده، فاصله‌گذاری و خط جداکننده رو حرفه‌ای می‌کنن.
بی‌نیاز از «View»های اضافه، فقط با «Composable»های آماده، طرح رو مرتب کن.

🌀 «Spacer»: یک فضای خالی و انعطاف‌پذیر برای جدا کردن المان‌ها
🌀 «Divider»: خطی باریک برای تفکیک بخش‌های مختلف صفحه

مثال واقعی: لیست تنظیمات که بین هر آیتم خط جداکننده داره و بین دو بخش اصلی فاصله ایجاد کردیم.

کد ساده اما کاربردی:

@Composable
fun SettingsScreen() {
Column(
modifier = Modifier.padding(16.dp)
) {
Text("تنظیمات حساب", style = MaterialTheme.typography.h6)
Spacer(modifier = Modifier.height(12.dp)) // فاصله عمودی
Text("اطلاعات شخصی")
Divider(
modifier = Modifier.padding(vertical = 8.dp),
thickness = 1.dp,
color = MaterialTheme.colorScheme.outline
)
Text("حریم خصوصی")
}
}


توضیح:
- «Spacer» با ارتفاع ۱۲dp دو متن رو از هم جدا کرده.
- «Divider» با ضخامت ۱dp و رنگ outline، بخش‌ها رو به‌طور ظریف جدا می‌کنه.

🎯 یاد بگیر که چیدمان رو با کمترین کد، حرفه‌ای‌تر کنی.

#Codeit #Android #Kotlin #Jetpack #JetpackCompose #ComposeUI #UIDesign
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1👏1