<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های پریسا جدیدی</title>
        <link>https://virgool.io/feed/@parisajadidi</link>
        <description>Android Developer</description>
        <language>fa</language>
        <pubDate>2026-06-17 02:42:16</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/428910/avatar/w8XNkP.jpeg?height=120&amp;width=120</url>
            <title>پریسا جدیدی</title>
            <link>https://virgool.io/@parisajadidi</link>
        </image>

                    <item>
                <title>آموزش jetpack compose</title>
                <link>https://virgool.io/@parisajadidi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-jetpack-compose-fcukujp8eeor</link>
                <description>آموزش jetpack compose در اندرویدجت پک کامپوز(jetpack compose) یک ابزار تقریبا جدید در اندروید هست که امکان طراحی رابط کاربری native رو به شما میده که توسعه UI رو برای شما راحت تر و تسریع میکنه و دیگه نیازی به نوشتن به کدها با استفاده از xml نداریم. این مساله باعث شد این مقاله و مقاله های بعدی رو به آموزش این ابزار قدرتمند بپردازم.در این آموزش یک سری مباحث ابتدایی رو در jetpack compose به شما آموزش میدم که شما در پایان این آموزش اصول اولیه نوشتن jetpack compose رو درک خواهید کرد و یک برنامه ساده میتونید با اون بنویسید.برای کار با jetpack compose به صورت 100درصد از زبان کاتلین(kotlin) استفاده میشه در این آموزش فرض رو بر این گرفتم که شما دانش اولیه ای در زبان kotlin به دست آوردید.قدم اول: یه پروژه جدید ایجاد میکنیم.باید یک Empty Compose Activity ایجاد کنیم .مراحل ایجاد پروژه رو طبق عکس ها پیش برید.مقدار min sdk رو 21 گذاشتم زبان رو هم که kotlin هست.در نهایت finish رو میزنیم و منتظر میمونیم پروژه build بشه.پروژه ی شما ایجاد شده:همان طور که می بینید یک فانکشن Greeting با انوتیشن Composable@ مشخص هست رو داریم که یه تکست ساده در اون قراره داره .در واقع توابع برای نمایش ویو باید با این انوتیشن مشخص بشن.و برای اینکه در خروجی نمایش داده بشه باید داخل setContent کال بشه.اون پایین هم یه انوتیشن Preview@ می بینیم که به ما این امکان رو میده در حین طراحی ظاهر اون رو مشاهده بکنیم، برای این کار هر UI که طراحی کردیم رو مثلا اینجا فانکشن Greeting رو داخل اون هم کال کنیم.که میتونید مثل تصویر بالا طراحی هاتون رو سمت راست صفحه مشاهده بکنید.خب حالا بریم یک سری مفاهیم اولیه طراحی رو یاد بگیریم. Column:خب برای اینکه اجزا رو مثل LinearLayout عمودی(vertical) زیر هم بچینیم از Column استفاده می کنیم:Row:و برای اینکه اجزا رو به صورت افقی مثل LinearLayout افقی (horizontal) کنار هم بچینیم از Row استفاده میکنیم:Button:دکمه رو با استفاده از Button ایجاد میکنیم و در قسمت  زمانی که رویداد کلیک انجام میشود عملیات مورد نظرمون انجام میشود . و با کمک Modifier برای Button خودمون ارتفاع و عرض مشخص کنیم :Box:برای اینکه بتونیم در صفحه خود یک کادر درست کنیم از Box استفاده میکنیم و اجزای صفحه رو داخل او قرار میدیم و میتونیم برای اون با استفاده از Modifier  عرض و ارتفاع مشخص کنیم  یا حتی بک گراند بدیم بهش :Modifier:شاید براتون سوال شده باشه که modifier ها اصلا چی هستن، در واقع modifier ها به شما این امکان رو میدن یه نظم و ترتیب خاصی به composable خودتون بدید.چندتا از کارهایی که انجام میده رو اینجا براتون میگم:به شما این امکان رو میده که اندازه، چیدمان،ظاهر composable رو تغییر بدید.ورودی های کاربر رو پردازش بکنید.کارهایی مثل کلیک یه element یا اسکرول کردن ،زوم کردن،درگ کردن و ....تا اینجا یک سری ماهیم اولیه رو یاد گرفتید و میتونید UI های ساده مختلف برای خودتون طراحی کنید درآموزش های بعدی مفاهیم پیشرفته تری رو آموزش میدم.سوالاتتون رو در قسمت کامنت ها بپرسید حتما پاسخ میدم.</description>
                <category>پریسا جدیدی</category>
                <author>پریسا جدیدی</author>
                <pubDate>Tue, 25 Oct 2022 12:53:36 +0330</pubDate>
            </item>
                    <item>
                <title>کاربرد lateinit و lazy در کاتلین</title>
                <link>https://virgool.io/@parisajadidi/%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF-lateinit-%D9%88-lazy-%D8%AF%D8%B1-%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-qiceafjfx79v</link>
                <description>امکانات و ویژگی های بسیار خوبی در  Kotlin  وجود دارد، ما می توانیم از همه این ویژگی ها برای نوشتن یک برنامه بهتر استفاده کنیم. در میان تمام این ویژگی ها،  lateinit  و  lazy  از جمله ویژگی های مهم هستند. باید بدانیم چه زمانی از هرکدام از آنها استفاده کنیم.در این مقاله قصد داریم یاد بگیریم که کلمات کلیدی  lateinit  و  lazy  در کاتلین برای چه مواردی استفاده می شوند و تفاوت این دو در چیست؟کلمه کلیدی lateinit:در خیلی از موارد پیش میاد که ما احتیاج داریم یه متغیر رو تعریف کنیم اما نمیخواهیم اون رو مقدار دهی اولیه بکنیم چون مطمئن هستیم که اون متغیر قبل اینکه مورد استفاده قرار بگیره مقداردهی خواهد شد.یکی از راه های انجام این کار تعریف متغیر به صورت nullable به شکل زیر هست:اما اگر نخوایم اون رو nullable کنیم چطور؟اون وقته که باید از کلمه کلیدی lateinit استفاده بکنیم.باید مطمئن باشید که متغیر شما قبل از استفاده مقدار دهی اولیه شده باشه در غیر این صورت با این ارور مواجه میشید:اگر مطمئن نیستید که متغیر مقدار دهی شده یا خیر میتوند با استفاده از isInitialized این مساله رو بررسی کنید:نکته:برای استفاده از متغیر lateinit متغیر باید از نوع var باشه و نباید val باشه.lateinit برای داده های non-primitive(ایجاد شده توسط برنامه نویس)قابل استفاده است و متغیر نباید از نوع null باشد.کاربرد های Lateinit:1. برای مقداردهی اولیه متغیر ها استفاده میشود.2. برای inject یک شی با استفاده از Dagger.کلمه کلیدی lazy:یک سری کلاس ها وجود دارند که مقداردهی اولیه شی در آنها بسیار زمان بر هست و آنقدر زمان بر هست که موجب تاخیر در کل فرایند ایجاد کلاس میشود.به طور مثال فرض میکنیم یه کلاس به اسم HeavyClass داریم، و در یک کلاس دیگر به اسم SomeClass میخوایم آبجکتی از آن بسازیم :در اینجا ما در حال ایجاد یک آبجکت زمان بر هستیم که باعث کند شدن فرایندها در SomeClass میشه وامکان داره مواردی دراین کلاس وجود داشته باشند که از اصلا به وجود این شی نیاز نداشته باشند در اینجا باید از کلمه کلیدی lazy استفاده بکنیم:مزیت استفاده از lazy در اینجا این هست که این آبجکت فقط زمانی استفاده می شوند که صدا زده بشه(call بشه) در غیر این صورت ایجاد نمیشه.مزیت دیگر lazy این هست که یک بار آبجکت ساخته میشه و دفعات بعدی فقط صدازده میشه :خروجی کد بالا به این صورت هست:در کد بالا می بینید که آبجکت HeavyClass تنها زمانی ایجاد میشه که به اون دسترسی داشته باشید و اینکه آبجکت اون در تابع main وجود دارد.اغلب از lazy برای متغیر های read-only استفاده میشد.خب دوستان امیدوارم این مقاله براتون مفید واقع شده باشه در ادامه مطالب بیشتری رو باشما به اشتراک میگذاریم.</description>
                <category>پریسا جدیدی</category>
                <author>پریسا جدیدی</author>
                <pubDate>Wed, 27 Jul 2022 14:31:15 +0430</pubDate>
            </item>
                    <item>
                <title>الگوی طراحی factory</title>
                <link>https://virgool.io/@parisajadidi/%D8%A7%D9%84%DA%AF%D9%88%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-factory-dhsrkkedvoan</link>
                <description>factory methodالگوی factory یکی از پرکاربردترین pattern  هایی هست که تا به حال ایجاد شده.همون طور که از اسمش میتونیم حدس بزنیم ، به ما این امکان رو میده که یک object رو بدون اینکه کلاس دقیق اون رو مشخص کرده باشیم ایجاد بکنیم و از اون به راحتی استفاده بکنیم.کاربرد اون وقتی مشخص میشه که ما میتونیم از یک interface مشترک برای چندین منطق جداگانه استفاده بکنیم.کاربرد های factory pattern:کلاس هایی داشته باشیم که از آنها شی‌های زیادی ساخته می‌شود. با این کار برنامه نویس دیگر اشیا را ایجاد نخواهد کرد بلکه تمام مسئولیت ایجاد کلاس را به Factory Method واگذار می‌کند.قبل از ایجاد شی هایی که نرم افزار با آن‌ها کار می‌کند، نوع و وابستگی مربوط به آن‌ ها را ندانید.می خواهید با استفاده از اشیا موجود و جلوگیری از ساختن دوباره آن ها، در منابع سیستم صرفه جویی کنید.اپلیکیشن‌ها دارای تعداد خیلی زیادی کلاس هستند که از همه آن‌ها Object  ساخته می‌شود. تصور کنید که اپلیکیشن شما دارای 100 کلاس باشد که از هر کدام از آنها باید به صورت میانگین 5 شی و نمونه ساخته شود. بنابراین در نرم افزار حدود 500 هزار شی از کلاس‌ها مختلف ساخته شده است. مثلا کلاسی مثل User که در سرتاسر اپلیکیشن مورد استفاده قرار می‌گیرد.بنابراین اگر مثلا بخواهیم به Constructor مربوط به کلاس User پارامتری جدید اضافه کنیم، باید کلاس User را تغییر دهیم. این کار باعث می‌شود که در تمام پروژه، هر جایی که از آن کلاس شی ای ساخته شده است پارامتر جدید را مقداردهی و اضافه کنیم که کاری بسیار دشوار و زمان بر خواهد بود. اما با استفاده از الگوی طراحی Factory برای ساخت اشیا کارخانه ای خواهیم ساخت که وظیفه ساخت اشیا از کلاس‌های مختلف را بر عهده دارد. با این کار دیگر نیازی به ساخت شی‌ها با استفاده از کیورد new به صورت جداگانه نخواهیم داشت و کافی است برای ساخت اشیا از کارخانه ساخت آن کلاس استفاده کنیم.بهترین راه برای درک بهتر این مطلب این هست که یه مثال از اون رو باهم بررسی کنیم:یه interface به اسم brand ایجاد میکنیم.باید مجموعه ای از کلاس‌های فرزند سازنده (creator) برای انواع اشیایی که کارخانه می‌سازد، تعریف شوند.یک کلاس جدید به اسم BreadFactory ایجاد می کنیم.نمودار UML:برای درک بهتر به نمودار UML زیر توجه کنید:برای اینکه خودمون هم به صورت عملی بتونیم تست بکنیمدر پروژه ی خودتون activity_main.xml رو باز بکنید.یک text view ایجاد کنید .در فایل MainActivity.java کد های مربوطه رو قرار بدید.چیزی که در خروجی رو گوشی یبا امولاتور خود مشاهده میکنید به این شکل خواهد بودامیدوارم این مطلب براتون مفید بوده باشه با آرزوی موفقیت برای شما عزیزان .شما میتونید سوالات خود رو کامنت کنید حتما پاسخ داده میشه.</description>
                <category>پریسا جدیدی</category>
                <author>پریسا جدیدی</author>
                <pubDate>Tue, 19 Oct 2021 12:23:05 +0330</pubDate>
            </item>
                    <item>
                <title>برقراری ارتباط با استفاده از event bus</title>
                <link>https://virgool.io/@parisajadidi/%D8%A8%D8%B1%D9%82%D8%B1%D8%A7%D8%B1%DB%8C-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-event-bus-xqxdv5d9ycrb</link>
                <description>event busتا به حال شاید با روش های مختلف ارتباط بین اکتیویتی و کلاس های مختلف آشنا شده باشید توی این مقاله سعی دارم بهتون نحوه ارتباط بین بخش های مختلف رو با استفاده از event bus آموزش بدم.ایونت باس ها زمانی که یک پروسه به طور کامل انجام میشه ،به اکتیویتی و یا فرگمنت مورد نظر اطلاع میده.در استفاده از ایونت باس باید به چندتا نکته توجه بکنید: اگر در برنامه چندین ایونت باس داشته باشیم وقتی یکی از اون ها پابلیش میشه نباید باعث ایجاد تغییر در بقیه ایونت باس ها بشهاگر در یک اکتیویتی و یا یک فرگمنت subscribe کرده باشید باید حتما در لایف سایکل اکتیویتی و یا فرگمنت unregistered  کنید تا دچار memory leaks و کرش اپ نشید.حتما به این نکته توجه کنید اگه میخواید در فرگمنت subscribe کنید باید حتما فرگمنت مورد نظر ران باشه.به طور مثال برای ارسال یک پیام از یک فرگمنت به یک فرگمنت دیگه که الان ران نیست امکان پذیر نخواهد بود .نحوه استفادهاول از همه کتابخونه رو  اضافه میکنیم:dependencies {
    implementation &#039;org.greenrobot:eventbus:3.0.0&#039;
}در مرحله بعد باید لایف سایکل اون رو مشخص کنید.public class MainActivity extends AppCompatActivity {

    @Override
    protected void () {
        super.();
        EventBus.getDefault().unregister(this);
    }

    @Override
    protected void () {
        super.();
        EventBus.getDefault().register(this);
    }حالا یه مدل میسازیم، داخل مدل هر چیزی که نیاز داشته باشیم رو قرار میدیم.ما اینجا یه مدل ساختیم که شامل یه مقدار  به عنوان وضعیت  و یک مقدار پیام هست .public class IntentServiceResult {

    String  mResult;
    String mResultValue;

    IntentServiceResult(String resultCode, String resultValue) {
        mResult = resultCode;
        mResultValue = resultValue;
    }

    public String getResult() {
        return mResult;
    }

    public String getResultValue() {
        return mResultValue;
    }بعد از اون میرسیم به پابلیش کردن ایونت.که ما یه مقدار ok به عنوان نتیجه و یه پیام رو میفرستیم.ما میتونیم هرجایی که نیاز باشه اینکار رو انجام بدیم به طور مثال در ریسپانس درخواست ما به سرور .// do some work
    EventBus.getDefault().post(new IntentServiceResult(&amp;quotok&amp;quot, &amp;quotdone!!&amp;quot));ما کد هایی که الان بهتون میگم  رو توی اکتیویتی مورد نظر مینویسیم که هر زمان که ایونت پابلیش شد صدا زده بشه.public class MainActivity extends AppCompatActivity {

@Subscribe(threadMode = ThreadMode.MAIN)
public void doThis(IntentServiceResult intentServiceResult) {
       Toast.makeText(this, intentServiceResult.getResultValue(), Toast.LENGTH_SHORT).show();
} امیدوارم این آموزش براتون مفید واقع شده باشه در ادامه آموزش های بیشتری رو براتون میزارم.</description>
                <category>پریسا جدیدی</category>
                <author>پریسا جدیدی</author>
                <pubDate>Sat, 26 Dec 2020 14:16:29 +0330</pubDate>
            </item>
            </channel>
</rss>