گاهی وقت ها موردی پیش میاد که کلاس هایی که مینویسیم به کلاس های دیگه ای وابسته هستن. یعنی بدون اونها نمیتونن کارشون رو انجام بدن مثلا کد زیر رو ببینید
قطعا قبلا به این مورد برخورد کردید. الان کلاس Car برای انجام کارش به کلاس Wheel وابستگی داره.
اولین راهی که به نظر همه میرسه همینه دقیقا، که یه object ازش بسازن و استفاده کنن. پس مشکل کجاس؟
مشکل اینه که من هر دفه باید هی از روی کلاس نمونه بسازم.
راه بعدی چیه؟
راه بعدی اینه که کلاس مورد نیاز رو از طریق سازنده inject کنم.
اینهم یک نوعی از تزریق وابستگی محسوب میشه اما مشکل این کار کجاس؟
مشکل اینجاست که اگه من بجای یه کلاس 50 تا کلاس داشته باشم که وابسته به Wheelباشن، بعد از تغییر توی سازنده ی کلاسم باید بگردم و 50 جای دیگه رو تغییر بدم.
دیگه این راه حل ها کاربرد نداره.
داخل فلاتر یه راه حل پیش فرض برای تزریق وابستگی هست که توسط inheritedwidget انجام میشه. چون ما هرچی تو فلاتر داریم یه ویجت محسوب میشه.
مثلا ما یه کلاس داریم به اسم ()Appinfo
AppInfo(){
}
میایم و از این ویجت استفاده میکنیم
حالا کلاس 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 رو که بهش نیاز دارم اینجا برای تزریق بنویسم و جای دیگه ازش استفاده کنم:
حالا میرم اونجایی که بهش نیاز دارم:
تموم شد. حالا با هر تغییری در سازنده شما فقط یکجا کد رو تغییر میدین.
اگر فکر میکنید بهتر میشه این مورد رو توضیح داد خوشحال میشم تو نظرات بگین.