
در این نوشته قراره که درمورد بلاک کانکارنسی یا بهتره بگم استفاده از بلاک کانکارنسی در ترنسفرمر بلاک هست
و یاد خواهید گرفت که نحوه انتقال ایونت ها در بلاگ چگونه باشد و امیت چگونه انجام بشه
flutter pub add bloc_concurrency
ما چهار نوع ترنسفرمر یا همون انتقال دهنده توی بلاک کانکارنسی داریم که عبارت از
1- concurrent
2- sequential
3- droppable
4- restartable
این ترنسفرمر که بلاک هم بصورت دیفالت از این استفاده میکنه. در این روش هر ایونتی که بسمت بلاک بفرستیم اونو بصورت همزمان انجام میده و براش مهم نیست که ایونت دیگری هم آیا هنوز در کار هست یا نه
من از مثال سرچ برای تمامی کیس ها استفاده میکنم
مثلا ما یک باکس سرچ داریم و به ازای هر کلمه که توی باکس تایپ میکنیم یک ایونت از تکست که توی باکس هست به سمت بلاک ما میاد و در منطق بلاک اینطوره که با اومدن ایونت میره و به سرور درخواست اون کلمه رو میزنه و نتیجه رو به کاربر امیت(emit) میکنه
خب در این نوع ترنسفرمر دیگه براش مهم نیست که آیا اون ایونت که به سمت بلاک رفت امیت شده یا نشده بلاک میاد پروسه گرفتن مقدار سرچ رو دوباره شروع میکنه
که این مورد پیشنهاد نمیشه برای سرچ البته
این ترنسفرمر بصورت پله ای اوینت هارو امیت میکنه یعنی ایونت هارو جمع میکنه و زمانی که یک ایونت امیت شد میره و بعدی رو میخونه و امیت می کنه
برای سرچ مثلا من توی باکس سرچ می نویسم "عدنان کمالی چاهوئی" حالا بلاک اول حرف اول اسم منو میاد از سرور میگیره و نتیجه رو به کاربر نمایش میده بعد میره حرف اول و دوم رو از سرور میگیره و به کاربر نشون میده و الی ...
که باز هم این مورد توی سرچ به کار نمیاد
این ترنسفرمر میاد اولین ایونت رو میگیره و هرچی که همزمان با انجام این ایونت باشه رو در نظر نمیگیره
برای مثال توی سرچ من اگر "عدنان کمالی چاهوئی" رو سرچ کنم پشت سر هم، اولین ایونت که اول اسم من باشه یعنی حرف "ع" درخواست به سرور ارسال میشه و تازمانی که این حرف "ع" امیت نشده باشه بقیه ایونت ها در نظر نمیگیره مثلا تا من سرچ بکنم "عدنان کمالی " حرف "ع" امیت شده و در ادامه که می نویسم "چاهوئی" دو باره این حرف "چ" رو شروع میکنم به نوشتن ایونت "عدنان کمالی چ" میره برای دریافت از سرور
که به این روش روش پرشی هست و به درد سرچ نمیخوره
این ترنسفرمر میاد که کارو انجام بده میبینه یه اینونت جدید اومد، کار الانشو ول میکنه میره سراغ ایونت جدید
توی سرچ مثلا من اگر تایپ بکنم توی سرچ باکس "عدنان کمالی چاهوئی" تا مادامی که من توی سرچ مینویسم و امیت نشده کار فعلی رو رها میکنه و درواقع امیت انجام نمیشه
این روش بهترین گزینه برای سرچ هست که البته میشه با 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(), // اینجا ترنسرفر هارو استفاده کن ); } }
امیدوارم مطلب به دردتون خورده باشه
منبع من برای این نوشته:
عدنان کمالی | Adnan Kamali