🧠 یک توسعهدهنده خوب فقط کد مینویسد؛ اما یک توسعهدهنده برند، دیده میشود!
«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
✨ یادگیری بدون ساختن مثل خوندن کتاب رانندگی بدون نشستن پشت فرمونه!
📚 خیلی از برنامهنویسها ماهها توی «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
📚 خیلی از برنامهنویسها ماهها توی «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» است که رشته متنی را دریافت کرده و روی صفحه نمایش میدهد.
از تنظیم سایز و رنگ گرفته تا فونت و ترازبندی، همه چیز با پارامترهای ساده قابل کنترل است.
📌 کاربرد واقعی: نمایش نام کاربر، عنوان صفحه، توضیحات محصول، یا هر متنی که نیاز به استایلدهی داشته باشد.
💻 بیایید یک مثال ساده ببینیم:
🔍 توضیح کد:
- «text»: متن اصلی را مشخص میکند.
- «fontSize»، «color»، «fontWeight»: ظاهر متن را تنظیم میکنند.
- «textAlign»: تراز متن را تعیین میکند.
- «modifier»: با «fillMaxWidth» عرض کامل و با «padding» فاصله داخلی اضافه میکند.
✅ نکته کاربردی: برای استایلدهی حرفهایتر میتوانید از «MaterialTheme.typography» استفاده کنید تا فونتهای استاندارد پروژه را اعمال کنید.
---
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #TextComposable #UI #MobileDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
اگر میخواهید متنهای زیبا، حرفهای و قابل تنظیم در اپلیکیشن «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» دکمهها هستند.
بیایید ببینیم چطور میتونیم یک دکمه با ظاهر و رفتار دلخواه بسازیم.
🚀 مثال عملی:
فرض کنید یک دکمه «ثبت نام» میخواهید که با کلیک روی آن، یک پیام نمایش بدهد.
🛠️ کد ساده برای شروع:
💡 توضیح:
-
-
-
🎨 شخصیسازی بیشتر:
میتونید
📌 کاربرد:
این کد یک دکمه تمامعرض با ارتفاع ثابت و فاصله از کنارهها میسازه.
✅ نتیجهگیری:
با «Button» در «Jetpack Compose» میتونید دکمههای زیبا و واکنشگرا با کمترین کد بسازید.
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #UI #Button #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
یکی از پایهایترین کامپوننتهای 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»:
📌 در این کد از «painterResource» برای بارگذاری تصویر داخلی استفاده شده.
📌 «contentDescription» برای دسترسیپذیری (Accessibility) ضروری است.
📌 «contentScale» نحوه تطبیق تصویر با فضا را مشخص میکند (مثلاً «Crop» برای برش).
💡 کاربردی: اگر تصویر پروفایل کاربر یا بنر تبلیغاتی دارید، با این روش به راحتی نمایش میدهید.
✨ «Image Composable» انعطافپذیر و سریع است – حتی انیمیشن و تغییر اندازه هم آسان.
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #ImageComposable #AndroidDev #ComposeUI
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
گاهی اوقات سادهترین کارها مثل نمایش یک تصویر، در برنامهنویسی اندروید کلی دردسر دارد. اما در «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
خیلیها فکر میکنند برنامهنویس شدن نیاز به نابغه بودن داره. ❌ اما واقعیت چیز دیگهای هست.
در دنیای واقعی، برنامهنویسی یک مهارت عملی است، نه یک آزمون هوش. مثل یادگیری رانندگی یا آشپزی، هر روز تمرین کنی جلو میری. 🏃♂️
تازهکارها اشتباه میکنند:
❌ روزی ۸ ساعت کدنویسی، بعد یک هفته خستگی و ترک
✅ روزی ۳۰ دقیقه کدنویسی منظم، برای یک سال کامل
ثبات یعنی حتی وقتی حوصله نداری، بنشینی و یک خط کد بزنی. این عادت تو رو از ۹۰ درصد بقیه جدا میکنه. 💪
در دنیای واقعی، کارفرماها دنبال کسی هستند که پروژه رو تموم کنه، نه کسی که الگوریتمهای پیچیده رو از حفظ باشه.
تجربه شخصی: خیلی از برنامهنویسان موفق نه استعداد خاصی داشتند، نه ضریب هوشی بالا. فقط هر روز پای کد نشستند. 📈
توصیه عملی:
یک چالش ۳۰ روزه برای خودت تعریف کن. هر روز یک قطعه کد کوچک بنویس. حتی اگه ۵ خط باشه. بعد از یک ماه نتیجه رو میبینی. 🎯
این رو همیشه یادت باشه:
استعداد شروع خوبی است، اما «ثبات قدم» تو رو به خط پایان میرسونه. 🏁
#Codeit #Android #Kotlin #Jetpack #Consistency #Mindset #Programming #Growth
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
🔥2❤1
📱 «Jetpack Compose» Part 7: «Column» و «Row»
دو تا از مهمترین ابزارهای چیدمان در «Compose» رو یاد میگیریم.
🧱 «Column» همه چیز رو به صورت عمودی زیر هم میچینه.
➡️ «Row» همه چیز رو به صورت افقی کنار هم میچینه.
🔧 مثال واقعی: فرض کن میخوای یه کارت کاربر بسازی که اسم و دکمهها رو کنار هم داشته باشه.
📝 کد ساده برای شروع:
🔍 توضیح:
- «Column» بیرونی اسم کاربر رو بالا میذاره و دکمهها رو زیرش.
- «Row» داخلی دو دکمه رو کنار هم قرار میده.
💡 نکته کاربردی:
از «Column» برای لیستهای عمودی و از «Row» برای نوار ابزار یا دکمههای کنار هم استفاده کن.
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #UI #Layout
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
دو تا از مهمترین ابزارهای چیدمان در «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» است که فرزندانش را بهترتیب روی هم میچیند و هر کدام میتوانند موقعیت متفاوتی داشته باشند.
💡 مثال واقعی: یک کارت با عکس پسزمینه و متن روی آن.
کد زیر را ببینید:
✅ در این کد، «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
👨💻 وقتی میخواهید یک متن را روی تصویر بگذارید یا یک دکمه را در گوشهی کارت قرار دهید، «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»: خطی باریک برای تفکیک بخشهای مختلف صفحه
مثال واقعی: لیست تنظیمات که بین هر آیتم خط جداکننده داره و بین دو بخش اصلی فاصله ایجاد کردیم.
کد ساده اما کاربردی:
توضیح:
- «Spacer» با ارتفاع ۱۲dp دو متن رو از هم جدا کرده.
- «Divider» با ضخامت ۱dp و رنگ outline، بخشها رو بهطور ظریف جدا میکنه.
🎯 یاد بگیر که چیدمان رو با کمترین کد، حرفهایتر کنی.
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #ComposeUI #UIDesign
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
این دو ابزار ساده، فاصلهگذاری و خط جداکننده رو حرفهای میکنن.
بینیاز از «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
مهمترین مهارت یک توسعهدهنده «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» نمایش بدی، اپ کرش یا خیلی کند میشه.
📝 یه نمونه ساده:
✅ این کد یه لیست از محصولات رو با اسکرول نرم و عملکرد بالا نشون میده.
«items» تابعیه که لیست رو دریافت میکنه و برای هر آیتم یه «Composable» میسازه.
💡 نکته حرفهای:
برای کنترل بهتر از «LazyListState» استفاده کن تا موقعیت اسکرول رو ذخیره و بازیابی کنی.
📌 جمعبندی:
«LazyColumn» همون راهحل استاندارد برای نمایش لیستهای بلند در «Jetpack Compose» هست.
با این تکنیک اپت روانتر و حرفهایتر به نظر میرسه.
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #LazyColumn #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
«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 رو بهروزرسانی میکنن
🔍 یه مثال عملی: شمارندهای که با هر کلیک یکی زیاد میشه
✅ «remember» مقدار رو تا وقتی کامپوننت حذف نشده حفظ میکنه
✅ «mutableStateOf» باعث میشه با تغییر مقدار، UI دوباره ساخته بشه
✅ با «by» دیگه نیازی به
🎯 نکته: اگه «State» رو درست مدیریت نکنی، برنامه کند یا ناهماهنگ میشه
🛠️ تمرین: یه فیلد ورودی بساز و متن تایپ شده رو نمایش بده
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #StateManagement #MobileDev #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
اگه میخوای یه اپلیکیشن تعاملی بسازی، باید باهاش حرف بزنی 🗣️
«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» درستش میکنیم:
⚠️ این کد کار نمیکنه چون
حالا با «remember» اصلاحش میکنیم:
✅ اینجا «mutableIntStateOf» باعث میشه وقتی مقدار تغییر میکنه، UI بهطور خودکار آپدیت بشه و «remember» هم مقدار رو توی ریکامپوزها حفظ میکنه.
💡 نکته طلایی:
اگر مقدار به «Lifecycle» وابستهست (مثلاً ورودی کاربر)، از «rememberSaveable» استفاده کن تا حتی با چرخش صفحه هم دادهها از دست نره.
#Codeit #Android #Kotlin #Jetpack #JetpackCompose #ComposeState #Remember #AndroidDev
🌐 Codeit → https://code-it.ir
━━━━━━━━━━━━━━━
@CodeitMobile
تا حالا شده توی 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
ارتباط مؤثر یعنی بتونی یه مفهوم پیچیده رو طوری توضیح بدی که حتی یه تازهوارد هم بفهمه. این مهارت تو جلسات تیمی، مصاحبههای شغلی و حتی نوشتن مستندات به کارت میاد. 🗣️
اولین قدم: مخاطبت رو بشناس. اگه با یه مدیر صحبت میکنی، روی «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