کاربرد پکیج Equatable در فلاتر با مثال

سلام امیدوارم که روزهای خوبی در انتظار همگی باشه.

ممکنه بارها حین مشاهده آموزش های مختلف فلاتر به استفاده از پکیج Equatable بر خورده باشین و براتون سوال باشه کار این پکیج چیه؟چرا و چه زمانی باید ازش استفاده کنیم؟

بهتره این آموزش رو با یه سناریو پیش ببریم که درک مطلب راحت تر باشه.

فرض کنید شما به همراه برادر یا خواهرتون تنها عضو خانواده هستین و پدر تصمیم میگیره به شما دو نفر دوتا ماشین هدیه بده.(خوشبحالتون D:)

در ابتدا فرض ما این هست که دقیقا یک مدل ماشین با یک رنگ به هردوی شما عزیزان هدیه میدن و ما قصد داریم که مقایسه کنیم این دو ماشین رو که آیا دقیقا یک مدل و یک رنگ هستند یا خیر!

در محیط واقعی خدا به ما قدرت بینایی داده و نگاه میکنیم که آيا شبیه هم هستند یا نه... ولی در زبان دارت یه خورده قضیه فرق میکنه.

ادامه مطلب رو همراه من باشین که در قالب مثال عملی مطلب رو پیش بریم.

در زبان های برنامه نویسی برای مقایسه دو شی مختلف از اپراتور == استفاده میکنیم .(با این اپراتور برابر بودن رو بررسی میکنیم)
class GiftCar { 
final String model;
 final String color;  
const GiftCar({this.model, this.color});
}

در بالا ما یک کلاس داریم به اسم GiftCar که دوتا مشخصه مدل و رنگ ماشین رو براش تعریف کردیم.

ما در متد main خودمون دو شی یا نمونه از کلاس بالا میسازیم به این صورت:

void main() { 
final GiftCar car1 = GiftCar(model: '207', color: 'white');
final GiftCar car2 = GiftCar(model: '207', color: 'white');
print(car1 == car2); // false
 }

هردو نمونه ۲۰۷ سفید هست که ماشین اول مال خودمون هست و ماشین دوم متعلق به خواهر یا برادرمون ، حالا با استفاده از اپراتور == بررسی میکنیم که آیا این دو نمونه برابر هستند یا نه؟

وقتی نتیجه رو پرینت میگیریم و در کنسول به ما false بر میگردونه و میگه که این دوتا نمونه برابر نیستند،درصورتی که مشاهده میکنید،هردو مقادیرشون برابر هست.

به صورت پیشفرض در دارت هر نمونه ای که میگیریم یک hashcode و identity (هویت مثلا کد ملی برای هر فرد) خاص به اون نمونه اختصاص داده میشه و حتی دو نمونه با مقدارهای یکسان رو هم برابر نمیبینه.چاره چیه؟کد زیر رو مشاهده کنید.

class GiftCar { 
final String? model;
 final String? color;  
const GiftCar({this.model, this.color});
 @override 
  bool operator ==(Object other) =>
identical(this, other) ||
 other is GiftCar && 
 runtimeType == other.runtimeType && 
 model == other.model &&  
color == other.color;  
@override 
  int get hashCode => model.hashCode ^ color.hashCode;
}

باید به شکل بالا برای مقایسه دو نمونه عمل کنیم و به دارت بفهمونیم که identity و hashcode نمونه های ما یکی هستن و وقتی نتیجه برابر بودن رو با تکه کد زیر بررسی میکنیم دارت به ما true بر میگردونه و میگه که این دو نمونه برابر هستند.

void main() { 
final GiftCar car1 = GiftCar(model: ' 207 ', color: 'white');
final GiftCar car2 = GiftCar(model: ' 207', color:'white');
print(car1 == car2); // true
 } 

تصور کنید که ما نمونه های مختلفی داشته باشیم و بخوایم برابر بودن یا نبودنشون رو مقایسه کنیم؟

آیا این همه کار تکراری و کد تکراری رو هر دفعه باید انجام بدیم؟بهتره به جای این همه کار تکراری ، تمرکزمون روی پروژه ای که داریم انجام میدیم باشه و وقتمون رو با دوباره نوشتن این همه کد تلف نکنیم.

اینجاست که برادر گرامی فیلیکس آنجلو یه پکیج منتشر کرده به اسم Equatable که همین کارو بدون این همه کار اضافی برای ما انجام میده و در پس زمینه خودش این همه کد رو اضافه میکنه و از طرف ما نیازی به اضافه کردن و نوشتن این همه کد تکراری نیست.

اضافه کردن پکیج و استفاده از اون در پروژه:

باید پکیجش رو از اینجا به پروژه خودمون در فایل pubspec.yaml اضافه کنیم.

dependencies:   
equatable: ^2.0.5

و به شکل زیر عمل کنیم.

import 'package:equatable/equatable.dart'
 class GiftCar extends Equatable { 
final String? model;
 final String? color;  
const GiftCar({this.model, this.color}); 
@override List<Object> get props => [model, color];
}

همونطور که مشاهده کردید کد بالا رو، کلاسی که میخوایم نمونه های مختلفش رو با هم مقایسه کنیم رو از Equatable با کلید واژه Extends ارث بری میکنیم.

وقتی که ما از Equatable ارث بری میکنیم به اجبار باید از تکه کدی که اخر کد بالا مشاهده میکنید استفاده کنیم.

@override List<Object> get props => [model, color];

این تکه کد یه getter هست که لیستی از اون مشخصه هایی که میخوایم از کلاسمون رو مورد بررسی قرار بدیم رو از ما میخواد که ما در مثال خودمون دو مشخصه به اسم مدل و رنگ ماشین داریم که در بالا اضافه میکنیم.

نوع لیست ما هم از نوع object هست چون مشخصه های ما میتونن شامل هر نوع داده ای string ، int و ... باشن.

و وقتی کد زیر رو اجرا میکنیم به ما true برمیگردونه و میگه که نمونه های ما برابر هستند.

void main() { 
final GiftCar car1 = GiftCar(model: '207', color: 'white');
final GiftCar car2 = GiftCar(model: '207', color: 'white');
print(car1 == car2); // true } 

این همه دردسر کشیدیم که بگیم ماشین های شما عزیزان یکی هستند.از اولشم میدونستیم یکین ولی چاره چیه؟برنامه نویسیه دیگه!راحت که نیست!خلاصه مبارکتون باشه ماشین ها

این پکیج Equtable در جاهای مختلفی استفاده میشه،یکی از مهم ترین کاربرداش استفاده در قسمت states و events استیت منیجیمنت بلاک هست که خیلی مورد استفاده قرار میگیره.

در این مطلب قصد داشتم به صورت کلی شمارو با این پکیج آشنا کنم که متوجه کاربردش بشین و وقتی مفهوم کاری که انجام میده رو درک کنیم ، راحت تر متوجه علت استفاده این پکیج در مثال ها و کدهای مختلف میشیم.

امیدوارم که مطلب مورد پسندتون قرار گرفته باشه.

اگر نکته خاصی هم به نظر شما جا مونده یا بهتره اضافه بشه خوشحال میشم کامنت بزارین که به مطلب اضافه کنم.

با ارزوی موفقیت

یاعلی