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

Kotlin • Android

🚀 آموزش ساده، کاربردی و پروژه‌محور
💡 مخصوص توسعه‌دهندگان موبایل
Download Telegram
«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
🐛 باگ‌ها دشمن تو نیستن؛ بهترین معلم‌های برنامه‌نویسی‌ان!
مهم‌ترین مهارت یک توسعه‌دهنده «Android» اینه که باگ رو فرصت یادگیری ببینه، نه نشونه ضعف.

🧠 وقتی یه باگ ظاهر میشه، ذهنت رو از حالت دفاعی خارج کن. به جای ناراحتی، بپرس: «این باگ داره چی به من یاد میده؟»
«Debugging» واقعی همینه: تبدیل هر خطا به یه درس عملی.

📖 یه روش ساده:
1. باگ رو توی «Android Studio» با «Logcat» پیدا کن.
2. دقیقاً بخون که کدوم خط و چه مقداری باعث خطا شده.
3. توی دفترچه یا «Notes» بنویس: «این بار یاد گرفتم که «Null Safety» رو جدی‌تر بگیرم.»

💡 باگ‌های تکراری‌ رو تحلیل کن؛ اونا نشون‌دهنده نقاط ضعف دانشت هستن.
مثلاً اگه مدام با «ViewModel» مشکل داری، یعنی وقتشه عمیق‌تر «Lifecycle» رو یاد بگیری.

🚀 هر بار که یه باگ رو رفع می‌کنی، یه قدم به یه توسعه‌دهنده حرفه‌ای‌تر نزدیک‌تر شدی.
از باگ‌ها نترس؛ ازشون استفاده کن تا «Kotlin» و «Jetpack Compose» رو بهتر بفهمی.

📝 آخر هفته یه لیست از باگ‌هایی که ماه گذشته حل کردی بنویس. می‌بینی چقدر رشد کردی!

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

━━━━━━━━━━━━━━━
@CodeitMobile
2🥰1👏1
🔥 یه لیست بلندبالا تو اپت داری و می‌خوای بدون لگ و کندی نشونش بدی؟
«LazyColumn» دقیقاً همون چیزیه که بهش نیاز داری.

📌 فرقش با «Column» معمولی اینه که فقط آیتم‌هایی رو که توی صفحه قابل دیدن هستن رو می‌سازه.
بقیه آیتم‌ها منتظر می‌مونن تا کاربر اسکرول کنه. به این کار می‌گن «Lazy Loading».

💡 استفاده از «LazyColumn» توی یه اپ فروشگاهی یا پیام‌رسان ضروریه.
اگه بخوای ۱۰۰۰ تا محصول رو با «Column» نمایش بدی، اپ کرش یا خیلی کند میشه.

📝 یه نمونه ساده:

@Composable
fun ProductList(products: List<String>) {
LazyColumn {
items(products) { product ->
Text(
text = product,
modifier = Modifier.padding(16.dp)
)
}
}
}


این کد یه لیست از محصولات رو با اسکرول نرم و عملکرد بالا نشون میده.
«items» تابعیه که لیست رو دریافت می‌کنه و برای هر آیتم یه «Composable» می‌سازه.

💡 نکته حرفه‌ای:
برای کنترل بهتر از «LazyListState» استفاده کن تا موقعیت اسکرول رو ذخیره و بازیابی کنی.

📌 جمع‌بندی:
«LazyColumn» همون راه‌حل استاندارد برای نمایش لیست‌های بلند در «Jetpack Compose» هست.
با این تکنیک اپت روان‌تر و حرفه‌ای‌تر به نظر می‌رسه.

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

━━━━━━━━━━━━━━━
@CodeitMobile
2🔥1👏1
📱 «Jetpack Compose» — قسمت ۱۱: اصول «State»

اگه می‌خوای یه اپلیکیشن تعاملی بسازی، باید باهاش حرف بزنی 🗣️
«State» همون حافظه‌ی کوتاه‌مدته که به کامپوزر می‌گه چی رو نشون بده 🔄

💡 هر وقت «State» عوض بشه، «Composable» دوباره کشیده میشه (Recomposition)
مثلاً وقتی کاربر روی دکمه کلیک میکنه، عدد شمارنده افزایش پیدا کنه

✍️ ساده‌ترین روش: استفاده از «remember» و «mutableStateOf»
این دو تا با هم «State» رو توی حافظه نگه می‌دارن و UI رو به‌روزرسانی می‌کنن

🔍 یه مثال عملی: شمارنده‌ای که با هر کلیک یکی زیاد میشه

@Composable
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("تعداد کلیک: $count")
}
}


«remember» مقدار رو تا وقتی کامپوننت حذف نشده حفظ میکنه
«mutableStateOf» باعث میشه با تغییر مقدار، UI دوباره ساخته بشه
با «by» دیگه نیازی به .value نداری و کد خواناتر میشه

🎯 نکته: اگه «State» رو درست مدیریت نکنی، برنامه کند یا ناهماهنگ میشه
🛠️ تمرین: یه فیلد ورودی بساز و متن تایپ شده رو نمایش بده

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

━━━━━━━━━━━━━━━
@CodeitMobile
2🥰1👏1
🎨 مستندسازی خودکار وضعیت UI با «remember» در «Jetpack Compose» 🧠

تا حالا شده توی Compose یه متغیر ساده تعریف کنی، ولی با هر ری‌کامپوز مقدارش از بین بره؟ 😵
اینجاست که «remember» وارد می‌شه! یه ابزار ساده که مقدار رو توی حافظه نگه می‌داره و تا وقتی Composable زنده‌ست، ناپدید نمی‌شه.

📌 کاربرد واقعی:
فرض کن داری یه اپلیکیشن تسک‌منیجر می‌سازی و می‌خوای تعداد کلیک‌ها روی یه دکمه رو نمایش بدی. بدون «remember» هر بار UI ریفرش می‌شه و شمارشگر صفر می‌شه.

اول یه متغیر معمولی رو نشون می‌دم، بعد با «remember» درستش می‌کنیم:

@Composable
fun CounterWithoutRemember() {
var count = 0
Button(onClick = { count++ }) {
Text("تعداد: $count")
}
}


⚠️ این کد کار نمی‌کنه چون count با هر ری‌کامپوز دوباره صفر می‌شه.

حالا با «remember» اصلاحش می‌کنیم:

@Composable
fun CounterWithRemember() {
val count = remember { mutableIntStateOf(0) }
Button(onClick = { count.intValue++ }) {
Text("تعداد: ${count.intValue}")
}
}


اینجا «mutableIntStateOf» باعث می‌شه وقتی مقدار تغییر می‌کنه، UI به‌طور خودکار آپدیت بشه و «remember» هم مقدار رو توی ری‌کامپوزها حفظ می‌کنه.

💡 نکته طلایی:
اگر مقدار به «Lifecycle» وابسته‌ست (مثلاً ورودی کاربر)، از «rememberSaveable» استفاده کن تا حتی با چرخش صفحه هم داده‌ها از دست نره.

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

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1🥰1
توی دنیای برنامه‌نویسی، خیلی‌ها کد می‌زنن، اما فقط تعداد کمی می‌تونن ایده‌هاشون رو شفاف به بقیه منتقل کنن. 🎯

ارتباط مؤثر یعنی بتونی یه مفهوم پیچیده رو طوری توضیح بدی که حتی یه تازه‌وارد هم بفهمه. این مهارت تو جلسات تیمی، مصاحبه‌های شغلی و حتی نوشتن مستندات به کارت میاد. 🗣️

اولین قدم: مخاطبت رو بشناس. اگه با یه مدیر صحبت می‌کنی، روی «Result» تمرکز کن، نه روی جزئیات فنی. اگه با یه توسعه‌دهنده‌ی دیگه‌ای، می‌تونی از «Abstraction» و «Design Pattern» حرف بزنی. 🧩

دومین قدم: از مثال‌های دنیای واقعی استفاده کن. به‌جای گفتن «این ماژول با «Clean Architecture» جدا شده»، بگو «مثل یه رستوران که آشپزخونه‌ش از سالن جدا شده، این ماژول‌ها هم وابستگی ندارن و هرکی می‌تونه مستقل کار کنه.» 🍽️

سومین قدم: از قیاس‌ها و تصویرسازی غافل نشو. مغز انسان با داستان‌ها و تصاویر بهتر ارتباط برقرار می‌کنه. مثلاً بگو «این «ViewModel» مثل یه کیف پوله که اطلاعات رو تا وقتی صفحه بسته نشده، نگه می‌داره.» 🎒

چهارمین قدم: ساده بگو، اما ساده‌انگارانه نه. اصطلاحات فنی رو با « » مشخص کن و اگه لازم شد، توضیح مختصری بده. مثلاً: ««Lazy Initialization» یعنی تا وقتی واقعاً بهش نیاز نداری، اون شئ رو نساز.» 🛠️

نکته مهم: وقتی یه تکنولوژی رو توضیح میدی، حتماً بگو چرا به کار میاد، نه فقط چیه. ««StateFlow» برای مدیریت وضعیت در «Jetpack Compose» عالیه چون همیشه آخرین مقدار رو داره و از مصرف حافظه جلوگیری می‌کنه.»

تمرین کن: هر روز یه مفهوم «Android» یا «Kotlin» رو برای یه دوست غیرفنی توضیح بده. کم‌کم می‌بینی چقدر ارتباطت بهتر میشه. 📈

یادت باشه: بهترین کد دنیا رو اگه نتونی توضیح بدی، بی‌فایده‌ست. ارتباط شفاف، کلید موفقیت توی هر تیم فنی‌ست. 💬

#Codeit #Android #Kotlin #Jetpack #CleanCode #SoftSkills #TechCommunication #DeveloperMindset
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1🥰1
📱 وقتی تلفن رو می‌چرخونی، اپ‌هات یادش می‌ره توی TextField چی نوشتی؟ 😤

«Jetpack Compose» یه راه‌حل ساده داره: «rememberSaveable»!
برخلاف «remember» که بعد از تغییر چرخش صفحه (Configuration Change) ریست می‌شه،
«rememberSaveable» مقدار رو توی «Bundle» ذخیره می‌کنه و موقع بازسازی کامپوزیشن برمی‌گردونه.

🌟 استفاده کاربردی: ذخیره ورودی کاربر، وضعیت چک‌باکس، شمارنده و هر داده‌ای که از بین نره.

یه مثال عملی می‌زنم:
کد زیر یک شمارنده داره که با دکمه زیاد میشه و بعد از چرخش صفحه مقدارش رو حفظ می‌کنه:

@Composable
fun CounterScreen() {
var count by rememberSaveable { mutableStateOf(0) }

Column(
modifier = Modifier.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Text(text = "شمارنده: $count", fontSize = 32.sp)
Button(onClick = { count++ }) {
Text("افزایش")
}
}
}


توضیح کد:
«rememberSaveable» مقدار count رو در Bundle ذخیره می‌کنه.
وقتی صفحه بچرخه یا اپ در حالت background بره، مقدار از دست نمیره.
داخل «mutableStateOf» هم خودش ری‌کامپوز رو مدیریت می‌کنه.

💡 نکته: برای داده‌های سنگین یا شیءهای سفارشی، باید Parcelable یا Serializable باشه،
اما برای انواع ساده (Int, String, Boolean) بدون مشکل کار می‌کنه.

🚀 این تکنیک رو امروز تو پروژه‌ات استفاده کن تا تجربه کاربری بهتری بدی.

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

━━━━━━━━━━━━━━━
@CodeitMobile
1🔥1🥰1
🚀 Jetpack Compose Part 14: State Hoisting – مدیریت هوشمند State در اپلیکیشن‌های کامپوز

تا حالا شده توی کامپوز، state رو تو یه کامپوننت تعریف کنی و بعد ببینی نمی‌تونی ازش جای دیگه استفاده کنی؟
این دقیقاً همون جایی‌ست که «State Hoisting» وارد بازی می‌شه!

🎯 State Hoisting یعنی: برداشتن state از داخل یک کامپوزیبل و انتقالش به بالا (مثلاً به ViewModel یا کامپوزیبل والد) تا چند تا کامپوننت بتونن باهاش کار کنن.

مزیت اصلی:
- کامپوننت‌ها بدون وابستگی مستقیم می‌تونن state رو تغییر بدن
- قابلیت تست کد چند برابر می‌شه
- کد تمیزتر و قابل نگهداری‌تر می‌شه

💡 مثال عملی:
فرض کن یه فرم ورود داری که توش دو تا فیلد «username» و «password» داری.
به جای اینکه هر فیلد state خودش رو داخل خودش داشته باشه، state رو به والد (مثلاً LoginScreen) می‌دی.

🔽 کد ساده و کاربردی:

@Composable
fun LoginScreen() {
var username by remember { mutableStateOf("") }
var password by remember { mutableStateOf("") }

Column {
TextField(
value = username,
onValueChange = { username = it },
label = { Text("Username") }
)
TextField(
value = password,
onValueChange = { password = it },
label = { Text("Password") }
)
Button(
onClick = { /* login with username & password */ }
) {
Text("Login")
}
}
}


🧠 کد بالا چطور کار می‌کنه؟
Stateهای «username» و «password» درون «LoginScreen» تعریف شدن.
ولی هر «TextField» فقط از طریق «onValueChange» اون state رو تغییر می‌ده.
اینجا راز «State Hoisting» همینه: state در بالا نگه داشته شده، و داده فقط به پایین (به کودک) منتقل می‌شه.

🎯 نکته پایانی:
وقتی state رو بالا بکشی، اپلیکیشن پیش‌بینی‌پذیرتر و کدت سازمان‌یافته‌تر می‌شه. این یکی از پایه‌های اصلی Jetpack Compose حرفه‌ایه!

#Codeit #Jetpack #Android #Kotlin #StateHoisting #ComposeTips
🌐 Codeit → https://code-it.ir

━━━━━━━━━━━━━━━
@CodeitMobile
2🔥1