ویرگول
ورودثبت نام
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالیمن عدنان کمالی چاهوئی هستم و برنامه نویس و درحال تبدیل شدن به مهندس کامپیوتر
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالی
خواندن ۳ دقیقه·۷ ماه پیش

بلاک کانکارنسی (bloc concurrency) در فلاتر

بلاک کانکارنسی در فلاتر
بلاک کانکارنسی در فلاتر

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

و یاد خواهید گرفت که نحوه انتقال ایونت ها در بلاگ چگونه باشد و امیت چگونه انجام بشه

  • اول از همه باید بگم برای نصب پکیج بلاک کانکارنسی در روت پروژه دستور زیر رو وارد کنید تا براتون نصب بشه
  • قبل از نصب یادتون باشه که بلاک رو نصب داشته باشید
flutter pub add bloc_concurrency

انواع ایونت ترنسفرمر (transformers)

ما چهار نوع ترنسفرمر یا همون انتقال دهنده توی بلاک کانکارنسی داریم که عبارت از

1- concurrent

2- sequential

3- droppable

4- restartable

ترنسفرمر concurrent

این ترنسفرمر که بلاک هم بصورت دیفالت از این استفاده میکنه. در این روش هر ایونتی که بسمت بلاک بفرستیم اونو بصورت همزمان انجام میده و براش مهم نیست که ایونت دیگری هم آیا هنوز در کار هست یا نه

من از مثال سرچ برای تمامی کیس ها استفاده میکنم
مثلا ما یک باکس سرچ داریم و به ازای هر کلمه که توی باکس تایپ میکنیم یک ایونت از تکست که توی باکس هست به سمت بلاک ما میاد و در منطق بلاک اینطوره که با اومدن ایونت میره و به سرور درخواست اون کلمه رو میزنه و نتیجه رو به کاربر امیت(emit) میکنه
خب در این نوع ترنسفرمر دیگه براش مهم نیست که آیا اون ایونت که به سمت بلاک رفت امیت شده یا نشده بلاک میاد پروسه گرفتن مقدار سرچ رو دوباره شروع میکنه

که این مورد پیشنهاد نمیشه برای سرچ البته

ترنسفرمر sequential

این ترنسفرمر بصورت پله ای اوینت هارو امیت میکنه یعنی ایونت هارو جمع میکنه و زمانی که یک ایونت امیت شد میره و بعدی رو میخونه و امیت می کنه
برای سرچ مثلا من توی باکس سرچ می نویسم "عدنان کمالی چاهوئی" حالا بلاک اول حرف اول اسم منو میاد از سرور میگیره و نتیجه رو به کاربر نمایش میده بعد میره حرف اول و دوم رو از سرور میگیره و به کاربر نشون میده و الی ...

که باز هم این مورد توی سرچ به کار نمیاد

ترنسفرمر droppable

این ترنسفرمر میاد اولین ایونت رو میگیره و هرچی که همزمان با انجام این ایونت باشه رو در نظر نمیگیره

برای مثال توی سرچ من اگر "عدنان کمالی چاهوئی" رو سرچ کنم پشت سر هم، اولین ایونت که اول اسم من باشه یعنی حرف "ع" درخواست به سرور ارسال میشه و تازمانی که این حرف "ع" امیت نشده باشه بقیه ایونت ها در نظر نمیگیره مثلا تا من سرچ بکنم "عدنان کمالی " حرف "ع" امیت شده و در ادامه که می نویسم "چاهوئی" دو باره این حرف "چ" رو شروع میکنم به نوشتن ایونت "عدنان کمالی چ" میره برای دریافت از سرور

که به این روش روش پرشی هست و به درد سرچ نمیخوره

ترنسفرمر restartable

این ترنسفرمر میاد که کارو انجام بده میبینه یه اینونت جدید اومد، کار الانشو ول میکنه میره سراغ ایونت جدید

توی سرچ مثلا من اگر تایپ بکنم توی سرچ باکس "عدنان کمالی چاهوئی" تا مادامی که من توی سرچ مینویسم و امیت نشده کار فعلی رو رها میکنه و درواقع امیت انجام نمیشه

این روش بهترین گزینه برای سرچ هست که البته میشه با rxdart ادغام کرد و سرچ های بهینه تری انجام داد و البته روش های دیگری هم هست.

برای درک بهتر این عکس رو میتونید مشاهده کنید

انواع ترنسفرمر در بلاک
انواع ترنسفرمر در بلاک

استفاده از ترنسفرمر ها

خب حالا چطوری این ترنسفرمر ها توی بلاک استفاده کنیم

  • یه نکته رو بگم اینکه این ترنسفرمر ها فقط برای بلاک هست و برای کیوبیت همچین قابلیتی نداریم


import 'package:bloc/bloc.dart'; import 'package:bloc_concurrency/bloc_concurrency.dart'; sealed class CounterEvent {} final class CounterIncrementPressed extends CounterEvent {} class CounterBloc extends Bloc<CounterEvent, int> { CounterBloc() : super(0) { on<CounterIncrementPressed>( (event, emit) async { await Future.delayed(Duration(seconds: 1)); emit(state + 1); }, transformer: sequential(), // اینجا ترنسرفر هارو استفاده کن ); } }

امیدوارم مطلب به دردتون خورده باشه

منبع من برای این نوشته:

pub.dev

عدنان کمالی | Adnan Kamali

۱
۰
Adnan Kamali | عدنان کمالی
Adnan Kamali | عدنان کمالی
من عدنان کمالی چاهوئی هستم و برنامه نویس و درحال تبدیل شدن به مهندس کامپیوتر
شاید از این پست‌ها خوشتان بیاید