<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهرداد</title>
        <link>https://virgool.io/feed/@mehrdadmmb2</link>
        <description>Android and Flutter developer</description>
        <language>fa</language>
        <pubDate>2026-06-06 19:38:52</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/13764/avatar/ij8Jt8.jpeg?height=120&amp;width=120</url>
            <title>مهرداد</title>
            <link>https://virgool.io/@mehrdadmmb2</link>
        </image>

                    <item>
                <title>ابزار رایگان و متن‌باز VisionMatch برای جستجوی عکس‌های مشابه با کمک هوش مصنوعی</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-%D9%88-%D9%85%D8%AA%D9%86-%D8%A8%D8%A7%D8%B2-visionmatch-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AC%D8%B3%D8%AA%D8%AC%D9%88%DB%8C-%D8%B9%DA%A9%D8%B3-%D9%87%D8%A7%DB%8C-%D9%85%D8%B4%D8%A7%D8%A8%D9%87-%D8%A8%D8%A7-%DA%A9%D9%85%DA%A9-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-l7devylipbae</link>
                <description>هوش مصنوعی تصاویر مشابهمدت‌ها بود دنبال یه راه ساده برای پیدا کردن تصاویر مشابه می‌گشتم. ابزاری که فقط یه عکس بهش بدم و اون برام توی کلی عکس دیگه، نمونه‌های شبیهشو پیدا کنه.اما نه متخصص هوش مصنوعی بودم و نه تجربه خاصی در کار با مدل‌های ML داشتم.با کمک ابزارهای قدرتمند متن‌باز، تونستم یه پروژه‌ی کوچیک ولی کاربردی بسازم به اسم VisionMatch.حالا VisionMatch چیه و چطور کار می‌کنه؟این ابزار یه API ساده داره که شما یه عکس بهش می‌دید، و اون با کمک مدل هوش مصنوعی اون عکس رو با دیتاست شما مقایسه می‌کنه و عکس‌های مشابه رو برمی‌گردونه.شما می‌تونید به راحتی دیتاست خودتون رو آماده کنید و عکس‌هاتون رو ایندکس کنید تا سیستم بتونه اونارو مقایسه کنه.ویژگی‌ها:کاملاً رایگان و متن‌بازبدون نیاز به GPU یا سرور سنگیننصب و راه‌اندازی آسان با Python و FastAPIقابل توسعه برای استفاده در پروژه‌های بزرگ‌ترپروژه برای کی مناسبه؟توسعه‌دهنده‌هایی که می‌خوان یه سیستم جستجوی تصویری ساده داشته باشناستارتاپ‌ها یا طراح‌هایی که می‌خوان داخل آرشیو عکس‌هاشون جستجو کننعلاقه‌مندان به هوش مصنوعی که دنبال یه پروژه‌ی واقعی برای شروع هستنلینک پروژه در گیتهاب📎 مشاهده در GitHubاگه از این پروژه خوشت اومد، یه ستاره توی گیتهاب بهم بدی خیلی خوشحال می‌شم ⭐حمایت مالی (اختیاری ❤️)اگه خواستی حمایتم کنی:💰 تتر(USDT, TRC20): TRzxqih3wSjPkb8EmrF7TzAvSquGhf1wwo₿ بیت‌کوین: bc1qxk0h9rdpgnh7yyc59uxndkrr2ndjglwtv3z72j</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sun, 20 Apr 2025 11:13:38 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش دیزاین پترن Fatory - فکتوری</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AF%DB%8C%D8%B2%D8%A7%DB%8C%D9%86-%D9%BE%D8%AA%D8%B1%D9%86-fatory-%D9%81%DA%A9%D8%AA%D9%88%D8%B1%DB%8C-gx0ymurinpzp</link>
                <description>یکی از الگوهای محبوب طراحی، فکتوریهالگوی Factory به ما اجازه می‌ده ساخت شیء‌های پیچیده رو کپسوله کنیم و این فرایند را ساده نگه داریم.مثلا فرض کنید می‌خوایم چند نوع مختلف از button داشته باشیم. می‌تونیم یک کلاس ButtonFactory داشته باشیم:حالا برای ساختن دکمه‌ها فقط کافیه نوع دکمه رو به Factory بدیم:val mainButton = ButtonFactory.getButton(ButtonType.MainButton)الگوی Factory یکی از الگوهای Creational هستش که برای ایجاد انواع مختلفی از objectها بکار میره.مزایای اصلی Factory Pattern:کپسوله کردن منطق ایجاد objectها: منطق مربوط به ایجاد objectهای پیچیده رو داخل Factory کپسوله میکنیم و کد کلاینت رو ساده نگه میداریم.جدا کردن ایجاد object از استفادش: کد کلاینت فقط نوع object مورد نیاز رو مشخص میکنه و نحوه ایجادش رو نمیدونهامکان اضافه کردن انواع جدید بدون تغییر در کد کلاینتاز موارد استفاده متداول Factory میشه به اتصال به Database، ساختن objectهای واسط گرافیکی و ... اشاره کرد.امیدوارم به کارتون بیاد</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sat, 30 Dec 2023 13:41:04 +0330</pubDate>
            </item>
                    <item>
                <title>تفاوت fetch، merge، rebase و pull در گیت</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-fetch-merge-rebase-%D9%88-pull-%D8%AF%D8%B1-%DA%AF%DB%8C%D8%AA-v0zm6wcheqv8</link>
                <description>آموزش گیتیکی از سردرگمی ها برای یادگیری گیت مخصوصا برای کسانی که تازه گیت را شروع کرده اند، درک تفاوت fetch، merge، rebase و pull و محل استفاده از آنهاست.در این مقاله، تفاوت بین این چهار دستور را توضیح خواهیم داد.fetchfetch تغییرات شاخه‌های ریموت را به مخزن محلی شما دانلود می‌کند، اما آنها را ادغام نمی‌کند. این دستور به شما امکان می‌دهد تا تغییرات جدید را در شاخه‌های ریموت مشاهده کنید و آنها را در صورت نیاز ادغام کنید.mergemerge تغییرات یک شاخه را به شاخه دیگر ادغام می‌کند. این دستور یک commit جدید ایجاد می‌کند که تغییرات دو شاخه را ترکیب می‌کند.rebaserebase تغییرات یک شاخه را بر روی شاخه دیگر بازنویسی می‌کند. این دستور به شما امکان می‌دهد تا تغییرات یک شاخه را به صورت خطی و بدون ایجاد conflict ادغام کنید.pullpull ترکیبی از fetch و merge است. pull تغییرات شاخه‌های ریموت را به مخزن محلی شما دانلود می‌کند و سپس آنها را به شاخه فعال ادغام می‌کند.تفاوت fetch و mergeتفاوت اصلی بین fetch و merge این است که fetch تغییرات شاخه‌های ریموت را به مخزن محلی شما دانلود می‌کند، اما آنها را ادغام نمی‌کند، در حالی که merge تغییرات یک شاخه را به شاخه دیگر ادغام می‌کند.تفاوت merge و rebaseتفاوت اصلی بین merge و rebase این است که merge تغییرات دو شاخه را ترکیب می‌کند و یک commit جدید ایجاد می‌کند، در حالی که rebase تغییرات یک شاخه را بر روی شاخه دیگر بازنویسی می‌کند.چه زمانی از fetch استفاده کنیم؟fetch را زمانی استفاده می‌کنیم که بخواهیم تغییرات شاخه‌های ریموت را به مخزن محلی خود دانلود کنیم. این دستور به ما امکان می‌دهد تا تغییرات جدید را در شاخه‌های ریموت مشاهده کنیم و آنها را در صورت نیاز ادغام کنیم.چه زمانی از merge استفاده کنیم؟merge را زمانی استفاده می‌کنیم که بخواهیم تغییرات یک شاخه را به شاخه دیگر ادغام کنیم. این دستور یک commit جدید ایجاد می‌کند که تغییرات دو شاخه را ترکیب می‌کند.چه زمانی از rebase استفاده کنیم؟rebase را زمانی استفاده می‌کنیم که بخواهیم تغییرات یک شاخه را به صورت خطی و بدون ایجاد conflict ادغام کنیم. این دستور به ما امکان می‌دهد تا تغییرات یک شاخه را بر روی شاخه دیگر بازنویسی کنیم.نکاتی برای استفاده از fetch، merge و rebaseاز fetch برای دانلود تغییرات شاخه‌های ریموت استفاده کنید.از merge برای ادغام تغییرات یک شاخه به شاخه دیگر استفاده کنید.از rebase برای بازنویسی تغییرات یک شاخه بر روی شاخه دیگر استفاده کنید.قبل از استفاده از rebase، مطمئن شوید که تغییرات را بررسی کرده‌اید.از rebase برای شاخه‌هایی که بازبینی شده‌اند و آماده ادغام هستند استفاده کنید.نتیجه‌گیریfetch، merge، rebase و pull دستورات مختلفی هستند که برای مدیریت تاریخچه و ادغام تغییرات از شاخه‌های مختلف در گیت استفاده می‌شوند. fetch تغییرات شاخه‌های ریموت را به مخزن محلی شما دانلود می‌کند، merge تغییرات یک شاخه را به شاخه دیگر ادغام می‌کند، rebase تغییرات یک شاخه را بر روی شاخه دیگر بازنویسی می‌کند و pull ترکیبی از fetch و merge است.با درک تفاوت بین این چهار دستور، می‌توانید از آنها برای مدیریت تاریخچه و ادغام تغییرات در گیت به طور موثر استفاده کنید.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Mon, 11 Sep 2023 14:31:20 +0330</pubDate>
            </item>
                    <item>
                <title>1- انواع کروتین در کاتلین</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%DA%A9%D8%B1%D9%88%D8%AA%DB%8C%D9%86-%D8%AF%D8%B1-%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-v9pdjtk2lfps</link>
                <description>کروتین ها در کاتلین به دو دسته تقسیم می شوند:کروتین های استاندارد: این نوع کروتین ها برای اکثر برنامه نویسی ها کافی هستند. آنها با استفاده از کلمه کلیدی launch ایجاد می شوند.کروتین های پیشرفته: این نوع کروتین ها ویژگی های بیشتری را ارائه می دهند، مانند:لغو جمعی: امکان لغو چندین کروتین به طور همزمان را فراهم می کند.مدیریت خطا: امکان مدیریت خطاها در کروتین ها را فراهم می کند.کروتین های بازگشتی: امکان بازگشت نتیجه از یک کروتین را فراهم می کند.کروتین های استانداردکروتین های استاندارد با استفاده از کلمه کلیدی launch ایجاد می شوند. این کلمه کلیدی یک کروتین جدید ایجاد می کند که در یک مخزن (dispatcher) خاص اجرا می شود. مخزن مسئول مدیریت اجرای کروتین ها است.نمونه کد کروتین این کد یک کروتین استاندارد ایجاد می کند که برای دریافت پاسخ از یک سرور اجرا می شود. کروتین پس از دریافت پاسخ از سرور تکمیل می شود.کروتین های پیشرفتهکروتین های پیشرفته با استفاده از کلمه کلیدی async ایجاد می شوند. این کلمه کلیدی یک کروتین جدید ایجاد می کند که در یک مخزن خاص اجرا می شود و نتیجه آن به صورت یک شیء Deferred برگردانده می شود.نمونه کد کروتین این کد یک کروتین پیشرفته ایجاد می کند که برای دریافت پاسخ از یک سرور اجرا می شود. نتیجه کروتین به صورت یک شیء Deferred برگردانده می شود. ما می توانیم از شیء Deferred برای دریافت نتیجه کروتین در آینده استفاده کنیم.نتیجه:کروتین ها در کاتلین به دو دسته تقسیم می شوند: کروتین های استاندارد و کروتین های پیشرفته. کروتین های استاندارد برای اکثر برنامه نویسی ها کافی هستند، اما کروتین های پیشرفته ویژگی های بیشتری را ارائه می دهند.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sun, 10 Sep 2023 17:43:35 +0330</pubDate>
            </item>
                    <item>
                <title>0-کاتلین کروتین چیست؟</title>
                <link>https://virgool.io/@mehrdadmmb2/%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DA%A9%D8%B1%D9%88%D8%AA%DB%8C%D9%86-%DA%86%DB%8C%D8%B3%D8%AA-eyyxhgtzkhpl</link>
                <description>آموزش کروتینکاتلین کروتین یک کتابخانه برنامه نویسی غیر مسدود کننده (non-blocking) برای زبان برنامه نویسی کاتلین است که برای توسعه اپلیکیشن های شبکه ای طراحی شده است. کروتین ها به توسعه دهندگان این امکان را می دهند تا کدهای غیر مسدود کننده بنویسند که باعث افزایش کارایی و بهره وری می شود.کروتین ها با استفاده از یک مدل برنامه نویسی غیر مسدود کننده کار می کنند که در آن چندین کار می توانند همزمان روی یک هسته اجرا شوند. این امر به جلوگیری از مسدود شدن برنامه در هنگام انتظار برای پاسخ از یک منبع خارجی کمک می کند.کروتین ها به توسعه دهندگان این امکان را می دهند تا کدهای غیر مسدود کننده بنویسند که به طور واضح تر و خواناتر از کدهای مسدود کننده است. این امر می تواند به افزایش کیفیت کد و بهبود نگهداری آن کمک کند.فواید کروتین:افزایش کارایی: کروتین ها می توانند کارایی برنامه های کاربردی شبکه ای را افزایش دهند. این امر به دلیل استفاده از یک مدل برنامه نویسی غیر مسدود کننده است که در آن چندین کار می توانند همزمان روی یک هسته اجرا شوند.بهبود بهره وری: کروتین ها می توانند بهره وری توسعه دهندگان را بهبود بخشند. این امر به دلیل استفاده از یک مدل برنامه نویسی غیر مسدود کننده است که کدهای واضح تر و خواناتر را امکان پذیر می کند.خوانایی بهتر: کروتین ها می توانند خوانایی کد را بهبود بخشند. این امر به دلیل استفاده از یک مدل برنامه نویسی غیر مسدود کننده است که کدهای واضح تر و خواناتر را امکان پذیر می کند.آموزش کروتین:برای یادگیری کروتین می توانید از منابع مختلفی استفاده کنید. یکی از منابع محبوب، مستندات رسمی کروتین است. این مستندات شامل آموزش های گام به گام و مثال های کد است.منبع دیگری که می توانید از آن استفاده کنید، دوره های آموزشی آنلاین یوتیوب است. این دوره ها معمولاً توسط متخصصان کاتلین ارائه می شوند و شامل آموزش های ویدیویی و تمرینات عملی است.نمونه کد:در اینجا یک نمونه کد از نحوه استفاده از کروتین برای توسعه یک اپلیکیشن شبکه ای آورده شده است:نمونه کد کروتین این کد یک کروتین ایجاد می کند که برای دریافت پاسخ از یک سرور اجرا می شود. کروتین پس از دریافت پاسخ از سرور تکمیل می شود.نتیجه:کروتین یک کتابخانه برنامه نویسی قدرتمند است که می تواند به توسعه دهندگان کاتلین کمک کند تا برنامه های کاربردی شبکه ای کارآمدتر و بهره ورتر ایجاد کنند.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sun, 10 Sep 2023 15:05:02 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش برنامه نویسی از صفر قسمت 1</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A7%D8%B2-%D8%B5%D9%81%D8%B1-%D9%82%D8%B3%D9%85%D8%AA-1-jreoxrrmsvda</link>
                <description>توی این دوره با ابتدایی ترین مفاهیم برنامه نویسی آشنا میشیم.اگر هیچ چیزی درباره برنامه نویسی نمیدونید. اگر درباره درامد، بازار کار و نحوه ی ورود به دنیای برنامه نویسی سوالات بی پاسخ دارید، اگر نمیدونید چجوری و از کجا باید شروع کنید ، و اطلاعی ندارید که در چه حوزه ای فعالیت کنید بهتره و چه زبان برنامه نویسی مناسب یادگیریه حتما این دوره رو ببینید.در این دوره سعی کردیم هر سوالی که در ذهن شماست درباره برنامه نویسی رو پاسخ بدیم.مباحث پوشش داده شده در این ویدیو:-چرا برنامه نویسی ؟- چقدر طول میکشه یاد بگیریم و وارد بازار کار بشیم ؟ویدیوی بعدی - &gt; - بررسی درآمد برنامه نویسان در خارج و ایران- انتخاب حوزه ی مناسب برای شروعمشاهده ویدیو</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sun, 18 Sep 2022 16:45:49 +0430</pubDate>
            </item>
                    <item>
                <title>برنامه آموزش زبان دیالون</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%AF%DB%8C%D8%A7%D9%84%D9%88%D9%86-wak5xs3i3elz</link>
                <description>قطعا نرم افزار های زیادی برای آموزش زبان انگلیسی وجود داره که با یک سرچ ساده تو کافه بازار یا گوگل پلی میتونید دانلود کنید.یکی از راهکارها برای یادگیری زبان که پیشنهاد میکنن دیدن فیلم و سریاله که باعث تقویت قوه ی شنیداری میشه.دیالون یه اپلیکیشنه که شما هر لغت، اصطلاح و ... که نیاز دارید معادل Native اون رو بشنوید، داخلش جستجو میکنید و برنامه برای شما توی فیلم ها وسریال ها جستجو میکنه و اون تیکه از فیلم رو براتون میاره.مثل خیلی از پیج های اینستاگرام که یه کلیپ میزارن و به شما لغت یاد میدن.تصاویری از محیط نرم افزار:آموزش زبان انگلیسی با فیلمآموزش زبانبرای دانلود کلیک کنید</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Tue, 04 Jan 2022 11:44:46 +0330</pubDate>
            </item>
                    <item>
                <title>مشکل گرفتن سکه تو برنامه</title>
                <link>https://virgool.io/@mehrdadmmb2/%D9%85%D8%B4%DA%A9%D9%84-%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D8%B3%DA%A9%D9%87-%D8%AA%D9%88-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-b7z0nqsxiui9</link>
                <description>سلامتوی این چند روز ایمیل های زیادی دریافت کردیم مبنی بر اینکه گرفتن سکه تو برنامه از کار افتاده.اول باید آپدیت جدید برنامه رو در تاریخ 1400/08/16 منتشر شده رو دانلود کنید.با توجه به بازخورد های متعددی که توی این دو سال داشتیم تصمیم بر این شد که تبلیغات ویدیویی رو حذف کنیم به چند دلیل:1- مصرف حجم کاربران2- اتلاف وقت کاربران3- دریافت سکه های کمبه همین دلیل بجای تبلیغ ویدیویی تبلیغ کلیکی اضافه کردیم که مزایای زیر رو داره1- عدم اتلاق وقت2- سکه های بیشتر3- عدم مصرف حجمپس دیگه لازم نیست برای گرفتن سکه کلی منتظر بمونینیکم صبر کنید تا بنر لود بشه. روی بنر برنامه کلیک کنید و بعد از باز کردن لینک سکه هاتون رو بگیرید.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sat, 06 Nov 2021 08:03:52 +0330</pubDate>
            </item>
                    <item>
                <title>تزریق وابستگی در فلاتر با Get_it</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%AA%D8%B2%D8%B1%DB%8C%D9%82-%D9%88%D8%A7%D8%A8%D8%B3%D8%AA%DA%AF%DB%8C-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-iy68vj8lkrvq</link>
                <description>گاهی وقت ها موردی پیش میاد که کلاس هایی که مینویسیم به کلاس های دیگه ای وابسته هستن. یعنی بدون اونها نمیتونن کارشون رو انجام بدن مثلا کد زیر رو ببینیدقطعا قبلا به این مورد برخورد کردید. الان کلاس Car برای انجام کارش به کلاس Wheel وابستگی داره.اولین راهی که به نظر همه میرسه همینه دقیقا، که یه object ازش بسازن و استفاده کنن. پس مشکل کجاس؟مشکل اینه که من هر دفه باید هی از روی کلاس نمونه بسازم.راه بعدی چیه؟راه بعدی اینه که کلاس مورد نیاز رو از طریق سازنده inject کنم.اینهم یک نوعی از تزریق وابستگی محسوب میشه اما مشکل این کار کجاس؟ https://idpay.ir/mmbpay مشکل اینجاست که اگه من بجای یه کلاس 50 تا کلاس داشته باشم که وابسته به Wheelباشن، بعد از تغییر توی سازنده ی کلاسم باید بگردم و 50 جای دیگه رو تغییر بدم.دیگه این راه حل ها کاربرد نداره.داخل فلاتر یه راه حل پیش فرض برای تزریق وابستگی هست که توسط inheritedwidget انجام میشه. چون ما هرچی تو فلاتر داریم یه ویجت محسوب میشه.مثلا ما یه کلاس داریم به اسم ()AppinfoAppInfo(){}میایم و از این ویجت استفاده میکنیمحالا کلاس MaterialApp رو wrapمیکنیم توی این ویجت.حالا فقط کافیه توی اون ویجتی که به AppInfoنیاز داریم اینجوری بنویسیم:Var appInfo=InheritedInjecttion.of(context).appInfo;حالا در صورت تغییر کلاس مورد نیاز دیگه نیازی به تغییر کلاس های دیگه نداریم.راه سوم:یه راه دیگه استفاده از کتابخونه های مختلفه. Get_itنسبتا خوب این کار رو انجام میده. البته یه تفاوتی داره با یه سری کتابخونه ها مثل hilt یا dagger که اینجا جاش نیست.لینک کتابخونه : https://pub.dev/packages/get_itیه فایل دارت میسازم به اسم locator و یه نمونه از GetIt میسازم و یک متد برای نوشتن کد های مربوز به تزریق:شما داخل تابع main برنامتون setupLocator رو صدا کنید.خوب حالا چی باید توی setupLocator بنویسیم؟ اینجا هر کلاسی که میخواید رو به دو روش کلی میتونید تزریق کنید. یکی singleton و یکی factoryفرقشون هم در اینکه که اگر سینگلتون تعریف کنید با هر بار فراخونی یه نمونه ی جدید ساخته نمیشه. ولی داخل factory این اتفاق میوفته و برای استفاده در لایه ی viewmodel مناسب به نظر میاد.من الان میخوام کلاس appinfo رو که بهش نیاز دارم اینجا برای تزریق بنویسم و جای دیگه ازش استفاده کنم:حالا میرم اونجایی که بهش نیاز دارم:تموم شد. حالا با هر تغییری در سازنده شما فقط یکجا کد رو تغییر میدین.اگر فکر میکنید بهتر میشه این مورد رو توضیح داد خوشحال میشم تو نظرات بگین.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Mon, 23 Aug 2021 10:34:20 +0430</pubDate>
            </item>
                    <item>
                <title>استفاده از FutureBuilder در فلاتر</title>
                <link>https://virgool.io/flutter-community/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-futurebuilder-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-l6gg1fn6qbz8</link>
                <description>سلام دوبارهدلم برای FutureBuilder تنگ شده بود دیدم خیلی جاها حتی اسمشم نشنیدن. برای همین این مقاله رو مینویسم.زمانی که شما نیاز دارید درخواست اینترنتی ارسال کنید یا هر کاری که توسط یه Future انجام میشه و نتیجش باید در UI نمایش داده شه، FutureBuilder یه ایده ی جالب داره.مثلا من یه request میدم و میخوام بدون استفاده از Statefull یا State Management خاصی نتیجه رو نمایش بدم.خوب حالا این متد چی برمیگردونه؟ آففرین یه instance از future  https://idpay.ir/mmbpay حالا میریم سراغ ui. شما پرنت ویجت هاتون رو FutureBuilder قرار میدین.یه ورودی داره به اسم  future که Future T میگیره اینجا متد خودتون رو بدید. حالا برای builder که یه context و یه snapshot برمیگردونه باید داخلش ویجت return کنید.دقت کنید که اگر کد رو اجرا کنید اولش خطا میگیرید و وقتی که دیتا از سرور گرفته شد بعدش درست نمایش داده میشه. برای حل این مشکل یبار if(snapshot.hasData) رو چک کنید و تا قبل اون یه لودینگ میتونید نمایش بدیدیه همچین چیزی هم برای Stream ها داریمتامامنظر بدین خوشحالترم.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Wed, 09 Jun 2021 16:24:41 +0430</pubDate>
            </item>
                    <item>
                <title>جلوگیری از اسکرین شات و رکوردرها در فلاتر</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%86-%D8%B4%D8%A7%D8%AA-%D9%88-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-rvqrggggzukw</link>
                <description>سلام. تو این مقاله یک راه برای غیر فعال کردن اسکرین شات و نرم افزارهای اسکرین رکوردر و میگم خدمتتون امیدوارم به کارتون بیادبرای فلاتر پکیجی ارائه شده که این کار رو نسبتا خوب انجام میده. بعد از نصب این پکیج:flutter_windowmanager: ^0.0.2نیاز به یه تابع دارید مثل تابع زیر:Future&lt;void&gt; secureScreen() async {
await FlutterWindowManager.addFlags(FlutterWindowManager.FLAG_SECURE); }باید اون رو هنگام شروع یک استیت فراخونی کنید:@override void initState() {
 secureScreen();  super.initState(); 
 }تمام شد.البته یک راه نیتیو هم داره که برای اندروید و آی او اس جدا جدا کد میزنید که اگر دوست داشتین اون رو هم میزارم.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Mon, 26 Apr 2021 16:21:54 +0430</pubDate>
            </item>
                    <item>
                <title>کارهای لازم موقع برنامه نویسی موبایل</title>
                <link>https://virgool.io/MobileLab/%DA%A9%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D9%84%D8%A7%D8%B2%D9%85-%D9%85%D9%88%D9%82%D8%B9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-auzxfqj8ugih</link>
                <description>دوباره سلامتوی این مقاله یکسری مواردی که تجربی بهشون رسیدم رو میخوام براتون بگم که بعضی هاشون برای راحتی خودتونه و بعضی هاشون برای راحتی کاربرتون. یعنی از لحاظ UX باعث میشه که کاربرتون حس بهتری داشته باشه ( البته من تخصص تو UX ندارم و این موارد تجربی هستن )خیلی فرقی نمیکنه که واسه چه پلتفرمی کد میزنید اما بهتره که این موارد رو رعایت کنید. هرچند که منظورم بیشتر سمت اپ های موبایلی هستش. اینم بگم که ترتیب خاصی نداره...۱- تصاویربهتره همه ی تصاویرتون Placeholderداشته باشن تا وقتی که عکس داره لود میشه کاربر خسته نشه. معمولا اینجور مواقع از لوگوی خود سایت یا اپ استفاده میکنن.اگرهم بتونید Shimmer پیاده سازی کنید فوق العادست.۲- لودینگتا اونجایی که میتونید از لودینگ های به شکل دیالوگ استفاده نکنید. سعی کنی مثل گوگل از Swipe استفاده کنید که یه چیزی اون بالا بچرخه و یا از لودینگ های خطی زیر تولبار استفاده کنید. استفاده از shimmer تو اولویته۳- لیست های خالیاگر یه صفحه دارید که قراره یه لیست از یه سری چیزا مثلا محصولات فروشگاه نشون میده ( مثلا لیست گوشی های سامسونگ ) و اون لیست ممکنه خالی باشه صفحه رو خالی ول نکنید به امید خدا. یه عکس با مفهموم اینکه چیزی پیدا نشد به کاربر نشون بدین بزارین حس خوب بهش دست بده. یا اگر میتونید این عکس رو فقط با ارتفاعی تو حدود ۲۰۰ تا ۳۰۰ dp  نشون بدین و زیرش محصولات دیگه رو معرفی کنید که ممکنه کاربر دوست داشته باشه.۴- مشکل اعداد فارسیخیلی از کاربرا زبون گوشیشون فارسیه و موقعی که شما میخواید یکسری محاسبات روی اعداد انجام بدین یا اون هارو با APIارسال کنید غالبا به مشکل برخورد میکنید. بهتره که این مشکل رو از قبل با نوشتن مثلا یه متد یا به صورت پایه ای حل کنید.۵- استفاده از Shared Preferenceتوی اندروید اطلاعات حساس رو تو  Shared Preference قرار ندید چون عین آب خوردن میشه بهش دسترسی داشته باش. بهتره حداقل از Hawk استفاده کنید یا از روش های جدیدی که خود گوگل پیشنهاد داده کمک بگیرید۶- ویرگولویرگول فارسی با انگلیسی متفاوته. اگر جایی خواستید جایگذاری کنید مثل توی سه رقم سه رقم جدا کردن قیمت حتما حواستون باشه replaceکنید.۷- اسکرول ویو تو همه صفحاتخیلی وقتا کاربرا با گوشی های کوچیک از اپ استفاده میکنن و ممکنه یکسری چیزا رو از دست بدن. دیدم که یه سری اپ ها وقتی کیبوردشون باز میشه دیگه دکمه رو از دست میدی. مجبوری اول کیبورد رو ببندی بعد رو دکمه کلیک کنی. یه اسکرول ویو بزارین این مشکل برطرف میشه.۸- ورژنینگهمیشه ورژن های مختلف اپ که ساین و منتشر میکنید رو بایگانی کنید. به موقعش خیلی مهم میشه ( اگه از گیت استفاده نمیکنید)۹- انیمیشناز انیمیشن استفاده کنید. Lottie بهترین پیشنهاده. حس خوبی به کاربر و خودتون میده.البته منظور این نیست که شورشو درارین اما جاهای مختلفی از برنامه هست که میتونید با انیمیشن حس خوبی به کاربر بدین</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Tue, 10 Nov 2020 14:41:22 +0330</pubDate>
            </item>
                    <item>
                <title>نگاهی به مدیریت state در فلاتر با Get</title>
                <link>https://virgool.io/@mehrdadmmb2/%D9%86%DA%AF%D8%A7%D9%87%DB%8C-%D8%A8%D9%87-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-state-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D8%A8%D8%A7-get-gen60oniledh</link>
                <description>سلام.اگر با فلاتر کار کرده باشید حتما با مشکلاتی در خصوص تغییر در UI اپلیکیشن مواجه هستین. صدا زدن مدام متد setsate خیلی کار تو مخیه و با سختی میشه از زیر تغییر بقیه ی قسمت هایی که نمیخوایم دوباره رندر بشن در رفت.پیکج های خوبی برای مدیریت استیت تو فلاتر ارایه شدن که میشه از BloC به عنوان معروف ترین اونا اسم برد که یک نوع دیزاین پترن یا شاید معماری هم هست.تو این مطلب یه نگاه کوچیک هم داریم (نه آموزش) به یه پکیج دیگه به اسم Get که یکی از کاراش مدیریت استیته.خلاصه ای از امکاناتش رو بخوام بگم میشه: https://idpay.ir/mmbpay ۱- راحت ترین روش برای Navigate کردن۲- بی دردسر ترین متد برای نمایش اسنک بار و دیالوگ بدون نیاز به Context۳- مدیریت استیت۴- متد باحال برای DataStore ۵- تعویض تم۶- متدهای جالب برای Validate کردن۷- تعویض Locale۸- تزریق وابستگیبعد از یه چندتا کد سمپل زدن باهاش خیلی زود ارتباط برقرار میکنید و مطمءنن ازش لذت میبرید.مثلا برای تغییر یه آیتم توی UI میتونید از چند روش استفاده کنید.یه کلاس میسازیم به اسم NameController  که از GetxController ارث ببره.class NameController extends GetxController {
  var fam = &amp;quot&amp;quot.obs;

  changeName(String fam) {
    this.fam.value = fam;
  }
}اون .obs  مشخص میکنه که این متغیر به صورت لایو تغییرات رو ردگیری میکنه درست مثل livedata توی اندروید. البته میشه به صورت زیر هم نوشت:var fam=RxString(&amp;quot&amp;quot); حالا بگذریم.فرض کنید که میخوایم متن یه Text رو عوض کنیم.حالا اگر دارید از اون obs استفاده میکنید ادامش به این شکله که باید برید ویجت Text خودتون رو بزارید تو ویجت Obs و اون باید Text  رو ریترن کنه:Obx(() =&gt; Text(&amp;quotClicked on ${nameController.fam}&amp;quot)),البته بالاتر nameController رو به شکل زیر تعریف کردم:final NameController nameController = Get.put(NameController());تمام شد. نکته اینکه نیازی نیست ویجتتون stateful باشه. حالا هرجایی که changeName رو صدا بزنید مقدار اتوماتیک آپدیت میشه.nameController.changeName(&amp;quotGhooodaaaa&amp;quot);یه سری متد باحال دیگه هم داره. مثلا ever. بهش متغیرتون رو پاس میدین بعد به ازای هربار تغییر اینم اجرا میشه. یا چیزای دیگه.به نظرم یه نگاه به داکیومنتش بندازین چیزای جالبی داره.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sun, 08 Nov 2020 16:03:08 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش فلاتر | نمایش دیالوگ در فلاتر</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%AF%DB%8C%D8%A7%D9%84%D9%88%DA%AF-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-rzea3o4lajb1</link>
                <description>سلام تو این مطلب میخوام از آموزش فلاتر میخوام نحوه ی نمایش دیالوگ در فلاتر رو براتون بگم که خیلی راحت و ساده ایه.اگر قسمت های قبلی رو ندیدین اینجا کلیک کنیدبرای نمایش دیالوگ در فلاتر میتونید از یه متد به اسم showDialog استفاده کنید که همه ی ابزار های مورد نیاز شما رو داخل خودش جا دادهمیتونید روی کلیک یه دکمه این دستور رو اجرا کنید تا مدیریتش راحت تر باشه.به این شکل میتونید کلاس رو صدا بزنیدshowDialog&lt;void&gt;()اولین پرامتر ورودی رو بهش context بدید.
 https://idpay.ir/mmbpay دومین پارامتری که میتونید بهش بدین barrierDismissible هستش که اگه false باشه قابل کنسل کردنه.و اصلی ترین پارامتر هم builder هستش که با گرفتن یه AlertDialog نمایش دیالوگ رو انجام میده.متد AlertDialog خودش از چند بخش تشکیل شده:title: عنوان، content: محتوای دیالوگ و actions دکمه هاکد کامل:showDialog(
    context: context,
    barrierDismissible: false, // user must tap button!
    builder: (BuildContext context) {
      return AlertDialog(
        title: Text(&#039;AlertDialog Title&#039;),
        content: SingleChildScrollView(
          child: ListBody(
            children: [
              Text(&#039;This is a demo alert dialog.&#039;),
              Text(&#039;Would you like to approve of this message?&#039;),
            ],
          ),
        ),
        actions: [
          FlatButton(
            child: Text(&#039;Approve&#039;),
            onPressed: () {
              Navigator.of(context).pop();
            },
          ),
        ],
      );
    },
  );یادتون نره این متد از نوع Async هستش. بعدا دربارش براتون مینویسماینم از یه قسمت دیگه از آموزش فلاتر. نظر یادتون نره</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Wed, 13 May 2020 12:43:27 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش فلاتر - مقدماتی</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-y33mxmazwzul</link>
                <description>سلام دوستان عزیز. یه دوره ی فوق العاده دیگه براتون آماده کردم که درآمدتون رو میتونه دو سه برابر یک برنامه نویسی معمولی بکنه.فلاتر یه ابزار خیلی حرفه ایه که توسط گوگل ارائه شده و تبدیل به رقیب مستقیم React Native شده.شما با فلاتر میتونید با یکبار کد زدن برای دو پلتفرم Android و Ios برنامه بنویسید. اما اگر اخبار فلاتر رو دنبال کرده باشید توی ورژن جدید فلاتر قابلیت گرفتن خروجی Web هم اضافه شده. اما داستان به اینجا ختم نمیشه و شما میتونید خروجی Windows، Mac و Linux هم بگیرید.یعنی شما میتونید تو یه شرکت استخدام بشید و حداقل حقوق 3 تا برنامه نویس رو بگیرید.تو این دوره ما فلاتر رو از ابتدا آموزش میدیم و تا سطحی پیش میریم که شما بتونید پروژه انجام بدید و وارد بازار کار بشید.حالا که اهمیت یادگیری فلاتر مشخص شد، بیاین شروع کنیم:مزایای دوره ی آموزش فلاتر- مثل همیشه مستقیم میریم سر اصل مطلب ...... مهارت در کار و کد نویسی- پرهیز از پرداختن به جزئیات- پرهیز از آموزش تیتروار و کتابی و کلیشه ای ( مثل همیشه )- تمرکز روی موارد مورد نیاز در بازار کار1)سرتیتر آموزش ها:- آشنایی با فلاتر و مقایسه با سایر ابزارهای کراس پلتفرم- دانلود و نصب فلاتر- اجرای اولین خروجی- آشنایی با ویجت های Text,Center و Style ها- آشنایی با ویجت های پایه Stack, Column, Row- درک مفهوم Stateless و Statefull- معرفی مفهوم Scaffold و شروع طراحی Material- استفاده از نقشه ی Google map در فلاتر-آشنایی با Listview در فلاتر- آشنایی با Scorllview عمودی و افقی- کار با Shared prefrences- استفاده از ClipRRect- معرفی Container و قابلیت های آن- معرفی Appbar- کار با کتابخونه ی http برای ارسال دریافت اطلاعات از اینترنت- نمایش اخبار سایت در List view- کار با Bottom Navigation Bar- معرفی Icon, IconButton- کار با تصاویر ( Image )- جابجایی بین صفحات توسط Navigator ها- معرفی Padding- کار با Button ها- و موارد بسیار بیشتری که در حین کار باهاشون سرکار خواهیم داشت.حاصل دوره- طراحی اپلیکیشن های با کیفیت برای اندروید و آی او اس- طراحی سریع و آسان UI برای اندروید و iOS- توانایی پیاده سازی برنامه های پیچیده- توانایی ارتباط با سرور، ارسال درخواست به سرور و دریافت پاسخ- ورود به بازار کار و استخدام در شرکت های برنامه نویسیپیش‌نیاز- آشنایی مقدماتی با یکی از زبان های برنامه نویسی ( مثل جاوا )- آشنایی ابتدایی با شی گرایی</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sat, 09 May 2020 13:53:54 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش فلاتر قسمت ۳ | شروع کار با ویحت‌ها</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D9%82%D8%B3%D9%85%D8%AA-%DB%B3-%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-%D9%88%DB%8C%D8%AD%D8%AA%D9%87%D8%A7-u8apvxqky3a9</link>
                <description>سلام مجدد به همه ی همراهان وب سایت همیار توسعه دهنده. به قسمت سوم آموزش فلاتر رسیدیم و میخوایم یه دید کلی به نحوه ی کار فلاتر داشته باشیم.وقتی که توی قسمت قبلی پروژه رو اجرا کردید، فلاتر دنبال متد main میگرده و اون رو اجرا میکنه. این متد اولین چیزیه که اجرا میشه. داخل متد main متدی وجود داره به اسم runApp که حتما باید یه کلاس Widget برگردونه. widget چیه؟ توی فلاتر هرچیزی که میبینید یه ویجت محسوب میشه. و تمام متدهایی که باید ویجت برگردونن درواقع دارن کار نمایش رو انجام میدن.متدهایی که Widget برمیگردونن دو نوع هستن. ۱- متدهایی که child میگیرن، یعنی یدونه ویجت نمایش میدنن. ۲- متد هایی که children میگیرن، یعنی چندین ویجت قبول میکنن برای نمایش.ببخشید اگر این آموزش بیشتر متنیه، چون باید مفهومی بگم که کامل درک کنید.خوب خالا متد runApp میتونه دو نوع کلاس ویجت پایه ای قبول میکنه:۱- کلاس StatelessWidget: نمایش ثابت سایر ویجت ها بدون امکان تغییر و بروزرسانی۲- کلاس StateFullWidget: نمایش سایر ویجت ها با قابلیت تغییر مقادیرشون در هنگام تغییرات برنامه.همه ی کدهایی که توسط خود ادیتور نوشته شدن رو حذف کنید و کدهای زیر رو اضافه کنید:import &#039;package:flutter/material.dart&#039;;
void main() {
runApp(
    Center(
      child: Text(
        &#039;Hello, world!&#039;,
        textDirection: TextDirection.ltr,
      ),
    ),
  );
}ویجت Center میتونه فقط یدونه ویجت زیرمجموعه قبول کنه. ویجت Center تو فلاتر هرچیزی که به عنوان child بهش بدین رو به وسط محدوده ی خودش میاره. مثلا ما اینجا بهش ویجت Text دادیم که کارش نمایش یه متن سادس. و گفتیم که جهت نوشتن متنش چپ به راست باشه. حالا اجرا کنید و نتیجه رو ببینید.البته خروجی خیلی ظاهر خوبی نداره و فقط یه صفحه ی سیاهه با یه متن ضایع.این کلیت کار ویجت ها در قسمت سوم آموزش فلاتر . بقیشون هم همینجورین. یعنی یا child میگیرن یا children.ویجت های پایه ای توی فلاتر رو براتون توی مطالب بعدی میگم تا این پست خیلی شلوغ نشه. اگر هم میخواید جلو جلو کار کنید به این صفحه یه سر بزنید.سوالی داشتید بپرسید</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sat, 15 Feb 2020 14:42:37 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش فلاتر قسمت 2| ساخت پروژه جدید در فلاتر</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D9%82%D8%B3%D9%85%D8%AA-2-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-nxmrvaucikhg</link>
                <description>سلام به همراهان وب سایت hamyardeveloper. قسمت دوم آموزش فلاتر رو با هم شروع میکنیم.اگر توضیحات آموزش نصب فلاتر رو نخوندید حتما یه سر بهش بزنید. اگر هم خوندید میتونید این آموزش رو دنبال کنید.اگر برای برنامه نویسی با اندروید استادیو کار میکنید که خیلی خوبه و کافیه مثل قبل از داخل منوی Flie یه پروژه ی فلاتر جدید بسازید. اگر هم الان دارید با vscode کار میکنید ( مثل من ) باید یکم command تایپ کنید. من تو دسکتاپم یه فولدر ساختم و داخل vsc بازش کردم. توی vsc برای اینکه بتونید یه پروژه ی جدید فلاتر بسازید باید کلید های ctrl+shift+p رو بزنید تا بخش command ش باز شه. توی این قسمت تایپ کنید flutter و بعد new project رو انتخاب کنید.?و بعد ازتون یه اسم برای پروژه میخواد. اون رو وارد کنید و آماده بشید تا پروژه ساخته بشه. ( ممکنه ازتون یبار دیگه محل نصب پروژه رو بخواد ).?خوب. همونطور که می بینید پروژه ساخته شد. حالا یه شبیه ساز مثل Nox یا AVD خود اندروید رو باز کنید و صبر کنید تا پایین سمت راست اسمش نمایش داده بشه. برای راه اندازی Nox شاید نیاز باشه از طریق CMD دستور اجراش رو بزنید. مثلا:nox_adb.exe connect 127.0.0.1:62026البته باید nox_adb رو به path سیستم عاملتون اضافه کنید.حالا میتونید اجرا کنید. چجوری؟ از منوی Debug گزینه ی Run Without Debug رو بزنید و صبر کنید تا run بشه. بعد از اجرا نتیجه به شکل زیر میشه?این هم از این قسمت از آموزش فلاتر، امیدوارم بدون دردسر اجرا کرده باشید. من سعی میکنم در کنار این آموزش های متنی، آموزش ویدیویی فلاتر رو هم اضافه کنم تا بهتر بتونید یاد بگیرید. اما فعلا این ها باشه تا بعدا با قدرت بیشتر آموزش های جدید رو بزارم. اگه سوالی دارید حتما بپرسید. منتظر ادامه ی آموزش ها باشید.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Sat, 15 Feb 2020 14:27:06 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش فلاتر - آموزش نصب فلاتر</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%86%D8%B5%D8%A8-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-z0hokjsac2im</link>
                <description>آموزش فلاتر - نصب و معرفیسلام به همه شما دوستان عزیز . با اولین قسمت از  آموزش فلاتر در خدمتتون هستم.مدتی صبر کردم تا فلاتر استیبل بشه و بعد براتون آموزشش رو بزارمهمونطور که میدونید فلاتر یک کیته که از طرف گوگل ارائه شده و به شما این امکان رو میده تا برای اندروید و آی او اس برنامه بنویسید فلاتر یه چیزی شبیه React Native هستش و دقیقا همون کارو میکنه یعنی شما یک بارکد بنویسید و میتونید ازش خروجی اندروید و ios بگیرید اگر نیاز به اطلاعات بیشتر درباره فلاتر دارید میتونید توی گوگل سرچ کنید و اطلاعات بیشتری کسب کنید اما طبق معمول می خوام آموزش شروع کنم و مستقیم برم سر اصل مطلب.شما هم میتونید توی Mac OS کد بنویسید و هم توی ویندوز اما اگر توی ویندوز بنویسید به این مشکل بر میخورید که نمیتونید خروجی ios بگیرید و برای اینکه بتونید برای ios خروجی بگیرید حتما باید مک داشته باشید.پس اگر کاربر مک هستید این براتون یک امتیاز محسوب میشه اما اگر فعلا میخوای تست کنید میتونید با این آموزش ها پیش بیاید. فقط دقت کنید برای تحویل یه پروژه ی خوب حتما باید همزمان روی هر دو سیستم عامل Android و Ios خروجی بگیرید چون یه سری جاها مشکل ایجاد میشه.ابزار های مورد نیاز فلاتر:1- Flutter SDK2- VS Code یا Android Studio3- ماشین مجازی اندروید برای تست برنامه ها مثل Noxبرای تست برنامه هاتون بهتره از AVD خود اندروید استفاده کنید که در این صورت حتما باید مراحل نصب اندروید استادیو رو کامل انجام بدین. مثل دانلود SDK های اندروید و ... . ولی دردسرش توی اجرا کمتره. Nox ممکنه یکم اذیت کنه، هرچند که خودم از اون استفاده میکنم.1-  اولین کاری که باید بکنیم نصب فلاتره.وار صفحه زیر بشیدhttps://flutter.dev/docs/get-started/installتوی این قسمت باید سیستم عامل تون را انتخاب کنید من چون ویندوز دارم ویندوز انتخاب می کنم. بعد از دانلود باید فایل رو Extract کنید.2- نصب VS Code یا Android Studioنصب اندروید استادیو رو که قبلا انجام دادیم بلدیم. اگر هم بلد نیستین قسمت های ابتدایی دوره ی آموزش برنامه نویسی اندروید رو ببنید تا متوجه بشید.بعد از نصب VS Code، باید برید تو یخش Extension ها. توی این قسمت Dart و Flutter رو نصب کنید.3- حالا باید flutter رو به سیستمتون معرفی کنید. روی This PC کلیک راست کنید و وارد properties بشید. سمت چپ Advanced system setting رو انتخاب کنید. تو پنجره باز شده برید به تب Advance و بعد تو پایین صفحه environment variable. حالا طبق تصویر آدرس bin در فولدر SDK دانلودی رو تو این قسمت اضافه کنید. باید روی Path دوبار کلیک کنید تا پنجره سمت راست باز شه و بعد بقیه ی ماجرا.برای اینکه تست کنید ببینید مسیر رو درست ست کردین یا نه، CMD رو باز کنید و بنویسید flutter. اگر اطلاعات داد ینی درست ست کردین.توی قسمت بعدی با هم نحوه ی تعریف یه پروژه ی جدید با فلاتر رو کار میکنیم</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Wed, 30 Oct 2019 11:39:30 +0330</pubDate>
            </item>
                    <item>
                <title>مقایسه‌ی Volley، Retrofit و AsynHttpClient در اندروید</title>
                <link>https://virgool.io/@mehrdadmmb2/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87%DB%8C-volley-retrofit-%D9%88-asynhttpclient-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-zyywzwzloufs</link>
                <description>مقایسه‌ی Volley، Retrofit و AsynHttpClient در اندرویدسلاماین نوشته فقط جمع بندی تجربیات شخصی و حرف های دوستان و همکاراس. ممکنه شما نظر دیگه ای داشته باشید.فکر میکنم مقایسه ی جالبی بشه.برای ارسال درخواست های client تو اندروید راه های زیادی وجود داره و کتابخونه های زیادی ارائه شده. اما سه تا از اونا خیلی سرو صدا کردن و اکثر آموزش های موجود تو اینترنت روی یه سه مورد تمرکز دارن. توی این مقاله میخوام این سه تا رو با هم مقایسه کنم و ببینیم کدوم یکی از اینا بدردبخور تره. البته اینم فراموش نکنید که اول و آخر شما از چیزی باید استفاده کنید که باهاش راحتین و این یه مقاله خیلی نباید روتون تاثیر بزاره.معرفی کتابخونه‌ی Volleyکتابخونه ی Volley از طرف گوگل ارائه شد. خیلی سبکه و کار باهاش خیلی سخت نیست. مشکل کم نداره و امکانات زیادی در اختیار شما قرار نمیده و یک مقدار هم کند عمل میکنه. درواقع خیلی نمیخوام روی این کتابخونه مانور بدم چون که خودم یه مدت ازش استفاده کردم و خوشم نیومد. طرفدارای کتابخونه ی volley خیلی متعصبن چون به هرحال مال گوگله. به نظر من والی معروف شد چون توسط یه برند معروف ارائه شد. اما قرار نیست هرچی از طرف گوگل بود خوب باشه که. اگر بخوایم نظر برنامه نویسای حرفه ای رو بدونیم باید یه سر به Github کتابخونه بزنیم و ببینیم برنامه نویسا چقدر توی توسعه‌ی اون فعال بودن.توی گیت هاب، Volley فقط 2400 تا لایک، 591 fork و 1 Branch داره که در مقابل موارد دیگه اصلا حرفی برای گفتن نداره. به نظرم اگر دارید ازش استفاده میکنید تجدید نظر کنید.معرفی کتابخونه‌ی AsyncHttpClientسبک، سریع، قدرتمند، سه ویژگی بزرگ این کتابخونس.کتابخونه ی مورد علاقه ی من توی گیت هاب 10500 تا لایک، 4288 تا Fork و 3 تا Branch داره. البته تعداد Branch ملاک نیست ولی خوب در حد اطلاعات میگم. کار کردن با AsyncHttpClient خیلی راحته و خیلی سریع میتونید اونو یاد بگیرید. سرعتش نسبت به والی بیشتره و باگ های اونو نداره. با همه ی متدها براتون کار میکنه، مهمترین ویژگی ای که داره اینه که درصد Process انجام شده رو بهتون میده ( البته به صورت بایت میده و خودتون باید درصدش کنید ). براتون فایل دانلود میکنه و درصدش رو بهتون بدون نیاز به ابزار های اضافی بر میگردونه. امکان ست کردن Agent، قابلیت Retry کردن Request که جای دیگه ای ندیدم والا، براتون عکس لود میکنه، فایل آپلود میکنه، جواب درخواست ها رو به صورت String یا Json object , Json array میده و شاید نون هم بگیره نمیدونم.عزیز دوست داشتنی من تا امروز جواب همه ی نیازهای شخصی من رو داده و هنوز دلیلی برای رد کردنش ندارم. خیلی ها بهم گفتن رتروفیت که تو مورد بعد دربارش میگم رو استفاده کنم و برام دلایلی هم آوردن اما برای اکثر کارهای خصوصا شخصی و پروژه های غیر شرکتی ( شرکت های بزرگ ) از این استفاده میکنم. شما هم استفاده کنید ضرر نمیکنید.برای اینکه دلتون قرص بشه اینم بگم که Instagram، Pinterest، Frontline Commando (Glu Games)، Heyzap، Pose  هم دارن از AsyncHttpClient استفاده میکنن دیگه تصمیم با خودتون.آموزش AsyncHttpClientآموزش ویدیویی AsyncHttpClientمعرفی Retrofitمگه میشه JakeWharton تو یه کاری مشارکت داشته باشه و محصول خروجی بد باشه؟ اگر 5 تا کتابخونه ی درست درمون برای اندروید ساخته شده باشه 4 تاش برای این آقاس. JakeWharton یه جورایی پدر توسعه دهنده ی اندروید محسوب میشه و تاثیر زیادی روی اون داشته.کتابخونه ی Retrofit در واقع برای تیم ( یا شایدم شرکت ) Square بوده اما توسعه دهنده ی اصلیش بدون شک جیک وارتونه. نحوه ی کار رتروفیت اینجوریه که با حاشیه نویس ها ( Annotations ) کار میکنه و بخاطر همین سرعت بهتری ارائه میده. کار کردن باهاش نسبت به دوتای قبلی سخت تره اما به قدری حرفه ایه که توی پروژه های بزرگ که قراره کارها خیلی اصولی پیش بره واقعا حرف اول رو میزنه. استاندارها و قوانین خاص خودش رو داره.قابلیت addConverterFactory یکی از ویژگی های جالب اونه که مثلا اینجا میتونید یه GsonConverter ست کنید تا خروجی تو قالب کلاس های Gson قابل استفاده باشه. امکان ترکیب کردن با RxAndroid بقیه ی کتابخونه ها رو از سر راه کنار زده و اینکه میتونید Reactive کد بزنید دیگه انتخاب دیگه ای بهتون نمیده. اگر میخواید حرفه ای کار کنید حتما برید سمت رتروفیت چون شرکت های بزرگ توی استفاده ازش تعصب دارن.رتروفیت 60000 تا لایک، 6100 تا Fork و 10 تا Branch داره و جالبه بدونید که 129 نفر توی این پروژه دارن مشارکت میکنن. دیگه ازین بهتر نداریم، باور کنید.نتیجه گیریبازم میگم بستگی به خودتون داره که از کدوم استفاده کنید اما به نظرم هم AsyncHttpClient و هم Retrofit رو قشنگ یاد بگیرید، شرکت های برنامه نویسی عمدتا روی رتروفیت تمرکز دارن و اینجا هم دیدیم که از بقیه سرتر بود. چالش های خاص خودش رو داره اما لذت بخشه.اگر شما هم کتابخونه ای رو میشناسین که به نظرتون تو این مقاله جا افتاده، میتونید معرفی کنید.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Fri, 13 Sep 2019 12:57:47 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Rxjava | استفاده از RxJava به جای Event Bus (انتقال اطلاعات با RxJava)</title>
                <link>https://virgool.io/@mehrdadmmb2/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rxjava-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-rxjava-%D8%A8%D9%87-%D8%AC%D8%A7%DB%8C-event-bus-%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A8%D8%A7-rxjava-z2mchaq9zemv</link>
                <description>در آموزش های قبلی یاد گرفتیم که با استفاده از event bus رویدادها رو broadcast بکنیم به طور مثال یک اکتیویتی و یک سرویس داریم زمانی که یک اتفاقی در سرویس رخ داد رنگ یک دکمه رو در اکتیویتی تغییر بدیم، یا یک سری داده رو به اکتیویتی ارسال بکینم.اگر آموزش EventBus رو ندیدید اینجا کلیک کنید.در این آموزش قصد داریم بهتون یاد بدیم چطور ازRxjava  برای پاس دادن اطلاعات استفاده بکنیم، قبل از اون مزیت هایی که این روش نسبت به روش قبلی داره رو بهتون میگم:بررسی کد ها از لحاظ  منطقی راحت ترهتست و دیباگ برنامه خیلی سریع ترهمدیریت thread ها ساده ترهخب مرحله اول یک کلاس bus می سازیم به جای object کلاس خودمون رو میذاریم. منظورم همون مدل دیتامونه که ممکنه یه String ساده باشه یا لیستی از اطلاعاتی که از وب سرویس میگرفتیم و Serialize میکردیم.public final class RxBus {

private static final BehaviorSubject&lt;Object&gt; behaviorSubject
        = BehaviorSubject.create();


public static BehaviorSubject&lt;Object&gt; getSubject() {
    return behaviorSubject;
}به اون قسمت از برنامه که میخوایم یه سری اطلاعات رو ارسال کنیم میریم وکدای زیر رو اونجا میزاریمMyData  data =getMyData();
                    RxBus.getSubject().onNext(data) ;
                    startActivity(new Intent(MainActivity.this, AnotherAct.class));بعد از اون به اکتیوتی که میخوایم اطلاعات رو دریافت کنه میریمDisposableObserver disposable;

 disposable = RxBus.getSubject().
            subscribeWith(new DisposableObserver&lt;Object&gt;() {


                @Override
                public void onNext(Object o) {
                    if (o instanceof MyData) {
                   Log.d(&quot;tag&quot;, (MyData)o.getData();
                    }
                }

                @Override
                public void (Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });
    });در اینجا متد onNext اطلاعات رو دریافت میکنه میتونیم هر عملیاتی مثلا نمایش در یک لیست ویو  رو اونجا انجام بدیم .فقط در آخر توجه داشته باشیم که برای جلوگیری از memoryleak  حتما باید unSubscribe کنیم@Override
protected void onDestroy() {
    super.onDestroy();
    disposable.dispose();
}شما کتابخونه ای میشناسید که بتونه این کار رو بهتر انجام بده؟ معرفی کنید.شاد و پیروز باشید.</description>
                <category>مهرداد</category>
                <author>مهرداد</author>
                <pubDate>Wed, 21 Aug 2019 12:40:28 +0430</pubDate>
            </item>
            </channel>
</rss>