کاهش کد Boilerplate در رابط کاربری فلاتر – به زبان ساده
زمانی که مشغول ساخت رابطهای کاربری موبایل هستیم، معمولاً لازم میشود که موقعیتهای مشابهی را بارها و بارها مدیریت کنیم و صفحهها و کامپوننتهای خود را بسازیم. یک مثال عمده از چنین وضعیتی، زمانی است که بخواهیم اپلیکیشن با منابع داده ریموت ارتباط برقرار کند. در این موارد احتمالاً در هر صفحه باید نوعی نشانگر بارگذاری در زمان اجرا شدن درخواست شبکه نمایش دهیم. در این مقاله با روش کاهش کد Boilerplate در رابط کاربری فلاتر آشنا خواهیم شد.
در چنین موقعیتهایی که در پاراگراف قبل توصیف کردیم، میتوان از BLoC Builder استفاده کرد. این سازندهها برای پاسخ دادن به حالتهایی که از سوی BLoC -ها ارائه میشوند، طراحی شدهاند و به این ترتیب UI میتواند به طرز مناسبی رندر شود. ما قصد داریم در این مقاله بر مبنای این مفهوم، سازندههای سفارشی BLoC ایجاد کنیم که حالتهای رایج BLoC را مدیریت میکنند و موجب کاهش کد قالبی یا Boilerplate میشود.
با اینکه این رویکرد میتواند برای طیف بسیار متنوعی از مقاصد مفید باشد، اما در این راهنما قصد داریم یک Builder سفارشی طراحی کنیم که به ما در مدیریت مشخصههای مرتبط با شبکه کمک میکند. سپس از این Builder جدید برای ایجاد یک صفحه ابتدایی کمک بگیریم که حالتهای یک BLoC را که شامل کارکردهای شبیهسازیشده شبکه است، رندر خواهد کرد.
برای شروع کار باید یک BaseNetworkState بسازیم که حالتهای BLoC ما را ایجاد میکند و میتوان آن را بسط داد. این کلاس شامل مشخصه isFetching خواهد بود که برای نشان دادن این که مشغول اجرای درخواست ناهمگامی هستیم در UI مورد استفاده قرار میگیرد.
سپس یک HomeState ایجاد میکنیم که اقدام به بسط BaseNetworkState ایجاد شده میکند و یک مشخصه name اضافی به آن میافزاید که BLoC برای ما بازیابی خواهد کرد.
اکنون زمان آن رسیده است که BLoC خود را بسازیم. این BLoC به رویداد FetchUser پاسخ خواهد داد و در آن ابتدا یک حالت با isFetching روی True تنظیم میشود تا UI بداند که یک عملیات ناهمگام در حال اجرا است. سپس BLoC شروع به شبیهسازی تأخیر شبکه از طریق ایجاد یک تأخیر مصنوعی میکند و در نهایت یک حالت شامل name مورد نظر بازیابی میشود.
اکنون میتوانیم بر این مبنا یک NetworkBlocBuilder بسازیم که قرار است کامپوننتهای UI مناسب را در پاسخ به مشخصههای BaseNetworkState رندر کنیم. در این مورد مسئول مدیریت رندر کردن نشانگر بارگذاری در زمانی که BLoC یک حالتی که isFetching به صورت True است. به صورت پیشفرض باید یک CircularProgressIndicator که به صورت مرکزگرا تنظیم شده است نشان دهیم، اما میخواهیم این وضعیت را با پذیرش این گزینه به عنوان یک آرگومان اختیاری، سفارشیسازی کنیم.
این وضعیت از طریق یک بسط ساده BlocBuilderBase به دست میآید و تنها با حالتهایی تطبیق خواهد یافت که BaseNetworkState انشعاب مییابند.
در نهایت HomeScreen را میسازیم که از NetworkBlocBuilder استفاده میکند تا به رندر کردن حالت BLoC کمک کند. اینک معنی این حرف آن است که علیرغم این که HomeBLoC چند مشخصه حالت دارد، تنها باید در مورد مدیریت name نگران باشیم.
بدین ترتیب پس از این که کاربر روی دکمهای که رویداد FetchUser را تحریک میکند، کلیک کرد، یک نشانگر بارگذاری تا زمانی که name ارائه شود نمایش مییابد و نیاز به انجام هیچ کار اضافی در HomeScreen وجود ندارد.
سخن پایانی
رویکردی که در این راهنما معرفی شد، به این مقدار محدود نمیشود و میتوان آن را برای استفاده در یک قابلیت جالب دیگر کتابخانه BLoC یعنی شنوندههای BLoC بسط داد. برای نمونه BaseNetworkState میتواند شامل یک مشخصه errorMessage باشد و یک مشخصه NetworkBlocListener مسئول نمایش کادر خطای مناسب در صورت وجود پیام باشد. به این ترتیب به پایان این مقاله میرسیم.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش فریم ورک Google Flutter برای طراحی اپلیکیشن های موبایل
- مجموعه آموزشهای برنامه نویسی اندروید
- گوگل فلاتر (Flutter) از صفر تا صد — ساخت اپلیکیشن به کمک ویجت
- مفاهیم مقدماتی فلاتر (Flutter) — به زبان ساده
==