<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Amin Rahkan | امین راه کان</title>
        <link>https://virgool.io/feed/@amin.rahkan7</link>
        <description>یک برنامه نویس و فعال حوزه کسب و کار</description>
        <language>fa</language>
        <pubDate>2026-06-17 14:27:01</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/46856/avatar/VAZqTw.jpg?height=120&amp;width=120</url>
            <title>Amin Rahkan | امین راه کان</title>
            <link>https://virgool.io/@amin.rahkan7</link>
        </image>

                    <item>
                <title>مقایسه View Binding و Data Binding</title>
                <link>https://virgool.io/@amin.rahkan7/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-view-binding-%D9%88-data-binding-ukwaxofrtpkr</link>
                <description>دو مفهوم نسبتا جدیدی که این روزها به مباحث برنامه نویسی علی الخصوص برنامه نویسی موبایل اندروید اضافه شده است دو مفهوم Data Binding و View Binding هست که قصد دارم در این پست به مقایسه و معرفی این دو بپردازم.هر دو اینها یعنی Data Binding و View Binding دو رویکرد متفاوت هندل کردن ارتباط بین رابط کاربری و داده هایی هستند که نمایش داده می شوند.خب Data Binding یک تکنیک هست برای اینکه به شما اجازه داده بشه که بتونید یک المان از رابط کاربری رو بایند کنید به یک Data در Data Source. وقتی Data در Data Source تغییر کند  المان متناظر ان در رابط کاربری به صورت اتومات ابدیت خواهد شد. اما View Binding یک تکنیک هست برای اینکه به شما اجازه داده بشه که بتونید یک المان از رابط کاربری رو بایند کنید به یک View Model.دو راه در اندروید وجود دارد که شما داده ها رو به View ها بایند کنید. Data Binding و View Binding. که در واقع Data Binding پروسه کانکت شدن داده ها به ویو هاست و View Binding پروسه کانکت شدن ویو ها به همدیگر است.در کل روش View Binding روش ساده تری است، همه آن چیزی که شما به ان نیاز دارید تعیین یک اسم برای Viewی است که می خواهید بهش بایند کنید و بقیه کارها توسط اندروید انجام می شود و این درصورتی هست که Data Binding نیاز دارد شما کد بنویسید تا دیتا به View بایند شود.روش Data Binding خیلی روش قابل انعطاف تری نسبت به View Binding هست اما در عین حال پیچیده تر هم هست. اگه مراقب این موضوع نباشید ممکن است با حجم زیادی از کد مواجه بشید که نگهداری اون سخت خواهد بود.خب، حالا به نظرتون کدام روش رو باید استفاده کنیم ؟ واقعیتش اینه که این بستگی به نیاز شما دارد. اگه شما فقط نیاز دارید چند تا View رو با هم دیگه بایند کنید، View Binding احتمالا همه ان چیزی هست که بهش نیاز دارید. ولی اگه نیاز دارید داده های زیادی رو به ویوهای مختلفی بایند کنید و یا اگه نیاز دارید کنترل های بیشتری روی چگونگی نمایش داده ها روی ویو ها داشته باشید احتمالا Data Binding روش بهتری خواهد بود.دیتا بایندینگ دقیقا چیست ؟همانطور که گفتیم دیتا بایندینگ پروسه کانکت کردن Data به View هست. این باعث میشه شما بتونید دیتا و ویو رو باهم سینک نگهدارید. دیتا بایندینگ می تونه یک پروسه دو طرفه باشه، یعنی تغییرات دیتایی می تونه روی View ها اثر بذاره و یا یک طرفه باشه به شکلی که تغییرات روی داده ها اثر گذار نباشد.ویو بایندینگ یه روش جدید برای بایند کردن داده ها به ویو هاست که در اندروید استودیو 3.1 معرفی شد، ویو بایندینگ اجازه میده به شما که از طریق کدتون دسترسی مستقیم داشته باشید به ویوها بدون FindViewById کردن آن ها. که این باعث میشه کدتون تمیزتر و ساده تر بشه. View Binding همچنین Data Binding دو طرفه رو ساپورت می کنه، به این معنی که تغییرات روی داده ها روی ویو ها هم تاثیر خواهد گذاشت.ویو بایندینگ دقیقا چیست ؟همانطور که گفتیم ویو بایندینگ پروسه ای هست که به شما اجازه میده ویو های خاص لایوت هاتون رو به سادگی کانکت کنید  به کدتون. این می تونه مفید باشه اگه شما نیاز داشته باشید رفرنس های متعددی از ویو در کدتون استفاده کنید و یا اینکه نیاز داشته باشید از استفاده از findViewById های متعدد ممانعت کنید. با استفاده از View Binding شما می تونید یک Object بایند شده به یک Layout بسازید و با استفاده از متغییر های بایند شده در اون آبجکت به ویو ها دسترسی مستقیم داشته باشید.ویو بایندینگ در اندروید استودیو ی ورژن ۳.۶ و بالاتر در دسترس هست. برای استفاد از ویو بایندینگ شما باید موارد زیر رو در فایل build.gradle اضافه کنید. android {
…
//To view binding
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// If you are using Kotlin, you also need to add the following:
kotlinOptions {
jvmTarget = “1.8”
}
//for binding view
buildFeatures {
    viewBinding = true
}

}بعد از اضافه کردن این موارد به فایل build.gradle ، پروژه اتون رو با فایل گریدل سینک کنید. زمانی که تمام شد، ویو بایندینگ اکتیو خواهد بود برای پروژه شما و دیگه می تونید ازش استفاده کنید. چطوری باهم فرق می کنند ؟ هر دوی Data Binding و View Binding دو اصطلاحی هستند که اغلب اوقات که در مورد توسعه اندرود صحبت می شود شنیده می شوند. اما واقعا چه معنی دارند؟ و هر کدام چه فرقی باهم دارند؟ ویو بایندینگ یک راهی هست برای متصل کردن کد شما به ویویو های خاص در لایوت ها. این به شما اجازه میدهد تا بتونید دسترسی داشته باشید و ویژگی های ویویویی کدتون رو مستقیما تغییر بدید. دیتا بایندینگ از سوی دیگر یک راهی هست برای بایند کردن یا اتصال دیتا به ویو های شما، که این به شما اجازه می دهد که بدون نوشتن کد های اضافی داده ها رو بایند کنید مستقیما به ویویو ها .</description>
                <category>Amin Rahkan | امین راه کان</category>
                <author>Amin Rahkan | امین راه کان</author>
                <pubDate>Mon, 19 Dec 2022 21:02:23 +0330</pubDate>
            </item>
                    <item>
                <title>۵ اکستنشن مهم کاتلین که هر اندروید دولوپری باید بداند.</title>
                <link>https://virgool.io/@amin.rahkan7/%DB%B5-%D8%A7%DA%A9%D8%B3%D8%AA%D9%86%D8%B4%D9%86-%D9%85%D9%87%D9%85-%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-%DA%A9%D9%87-%D9%87%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%AF%D9%88%D9%84%D9%88%D9%BE%D8%B1%DB%8C-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A8%D8%AF%D8%A7%D9%86%D8%AF-xafd1zsy3xbs</link>
                <description>مجموعه Android KTX یک کالکشنی از لایبراری های اندروید به همراه اکستنش های کاتلین هست که کدنویسی رو وقتی از لایبراری های جت پک و سایر لایبراری های اندروید استفاده می کنید آسان می کند. اکستنشن های KTX از ویژگی های کاتلین برای ارائه راهنمایی های مختصر به دولوپر ها برای کار کردن با جت پک و سایر API ها استفاده می کند. در ادامه به بررسی ۵ اکستنشن که می تونه توسعه اندروید رو آسان کند می پردازیم.  اکستنشن ViewModel روی LifeCycle Scope وقتی از ViewModel ها و Coroutines استفاده می کنیم، این مهم هست توی Scope باشند و تسک های بکگراند که طولانی تر ران می مانند داخل همان scope باشند و همینطور این تسک ها می توانند هر زمانی که نیاز شد کنسل بشوند. همینطور این اکستنشن ها می توانند جایی استفاده بشوند که شما می خواهید یک تسک محدود بشه به طول عمر یک کامپوننت خاص.  اسکتنشن ساخت ViewModelدر برنامه نویسی پیشرفته اندروید ما به این سمت حرکت می کنیم که از فرگمنت های به جای اکتیویتی ها استفاده کنیم. توی سالی که اومد، این اعتقاد وجود دارد به این سمت میریم که قابلیت های Compose جای Fragment ها رو خواهد گرفت، حالا در این شرایط ما باید یک نمونه موجود از ViewModel مربوطه را توسعه دهیم.اکستنشن LiveData Lambdas لایو دیتا یک  کلاس نگهدارنده داده هایی است که می تونه داده های قابل Observe شدن رو در خودش نگهدارد که این داده ها می تونن توسط سایر کامپونت های اندروید مانند فرگمنت و اکتیویتی Observe شوند. اسکتنشن Room KTX اکستنشن Room KTX یک لایه داینامیکی از Sqlite رو ارائه می کنه که کد نویسی رو اسان می کند، همچنین به تعبیری یک اهرمی فراهم می کند برای دیتابیس Room توسط کاتلین کروتین. همچنین استفاده از suspend function ها رو زمانی که  Room DAO به خوبی Flow Api وقتی دیتابیس ابدیت می شود نظارت می کند ممکن می سازد. Room یک لایبراری از مجموعه Jetpack هست که به صورت مجهز برای اجرای همین اهداف اومد. ترکیب کروتین و دیتابیس Room استفاده از اپراتور های Room رو راحت تر کرد. لبه تیزی که ویژگی هایی از قبیل Flow فراهم می کنه یک عملکرد روان بدون استفاده از کد های سنگین هست. اکستنشن Firebaseفایربیس همیشه به همراه لیستنر های مربوطه خودش میاد، لیستنر هایی مثل addOnCompleteListener، addOnSuccessListener ، addOnCanceledListener و غیره ...کروتین ها قابلیت اجرای اوپراتور های Async را به یک روش ترتیبی ارائه میدهد. که کمک میکنه که کد دقیق تری بسازیم. در فایربیس کالبک ها می تونن کمی سنگین باشند برای همین خوبه که تسک های فایربیس رو با استفاده از سرویس های کاتلین کروتین پیاده کنیم. این لایبراری به عنوان یک اکستنشن فانکشن با نام await شناخته میشه که تسک ها رو به صورت داخلی در یک suspend فانکشن اجرا می کند دقیقا بدون کالبک های اضافی فایربیس. این مقاله ترجمه ای بود از این مقاله که سعی شد با توجه به اینکه انگلیسی سختی داشت ولی ترجمه روانی داشته باشد. امیدوارم به دردتون بخورد. </description>
                <category>Amin Rahkan | امین راه کان</category>
                <author>Amin Rahkan | امین راه کان</author>
                <pubDate>Mon, 19 Dec 2022 01:47:44 +0330</pubDate>
            </item>
                    <item>
                <title>درک بلاک Init در زبان کاتلین</title>
                <link>https://virgool.io/@amin.rahkan7/%D8%AF%D8%B1%DA%A9-%D8%A8%D9%84%D8%A7%DA%A9-init-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-bk2r7yppehyq</link>
                <description>درک بلاک Init در زبان کاتلین در این پست، ما درباره بلاک Init در کاتلین یاد خواهیم گرفت. اما قبل از شروع اگه شما با جاوا اشنایی دارید. احتمالا با مفهوم سازنده ها یا Constructor ها آشنایی دارید. سازنده ها یک بلاک از کد می باشند، که مقداردهی می شوند وقتی یک شی از یک کلاس ساخته می شود. class SumOfNumbers {   
  SumOfNumbers() { 
    } 
 }در جاوا، سازنده ها یک نام یکسان با نام کلاس دارند. اما در کاتلین سازنده ها متفاوت هستند با چیزی که در جاوا هست. ما در کاتلین سازنده های اولیه و ثانویه داریم. شما می تونید اینجا بیشتر در موردشون بخونید. class Person(name:String,age:Int) {
      }مثال بالا یک مثال از یک کلاس از کاتلین هست که یک سازنده اولیه ( Primary Constructor )  دارد. اما مشابه جاوا اگه ما مجبور باشیم یه سری کارها رو در سازنده اجرا کنیم چطوری باید این کار رو انجام بدیم ؟  چون این کار به نظر میاد در Primary Constructor امکان پذیر نباشد. اگر چه برای این کار دو راه وجود دارد که یکیش استفاده از سازنده ثانویه یا Secondary Constructor هست و دیگری بلاک Init، اما ما اینجا فقط قصد داریم در مورد بلاک Init صحبت کنیم. بیاید در قالب یک مثال بلاک Init رو بهتر متوجه بشیم. توی مثال بالا در کلاس Person، اگر ما نیاز داشته باشیم چک کنیم که اگر person بزرگتر از سن من هست یا خیر ؟ به شکل زیر می تونیم این کار رو انجام بدیم. class Person(name: String, age: Int) {   
  val isOlderThanMe = false
  val myAge = 25 
   init {
       isOlderThanMe = age &gt; myAge    
 }
 }در اینجا، ما دو متغییر isOlderThanMe و myAge  رو به ترتیب با مقادیر پیش فرض false و 25 مقدار دهی کردیم.حالا، در بلاک init ما متغییر age رو از primary constructor مقایسه می کنیم با  متغییر myAge و اساین می کنیم مقدار این مقایسه رو به isOlderThanMe . اگر age بزرگتر از 25 بود مقدار اساین شده True خواهد بود و در غیر این صورت false خواهد بود. برای بررسی کد زیر رو ببینید، var person = Person(&amp;quotHimanshu&amp;quot, 26) 
 print(person.isOlderThanMe)
این کد نتیجه مطلوب رو پرینت خواهد کرد.  زمانی که کلاس Person با داده های ارسالی name با مقدار &quot;Himanshu&quot; و age با مقدار 26 مقدار دهی میشه، بلاک init به عنوان ابجکت ساخته شده فراخوانی خواهد شد و مقدار isOlderThanMe بر اساس شرایط تعریف شده ابدیت می شود. نکات قابل توجه : بلاک init همیشه بعد از سازنده Primary فراخوانی می شود.یک فایل کلاس می تواند یک یا چند بلاک init داشته باشد که به صورت سری و پشت سر هم اجرا می شوند. شاد باشید :) امین راه کان مطلب ترجمه ای بود از این پست </description>
                <category>Amin Rahkan | امین راه کان</category>
                <author>Amin Rahkan | امین راه کان</author>
                <pubDate>Thu, 17 Nov 2022 08:29:29 +0330</pubDate>
            </item>
            </channel>
</rss>