BLoC naxışından istifadə edərək Flutter-dəki vəziyyətlə necə məşğul olmaq olar

Mənbə: https://www.emanprague.com/de/blog/lets-develop-mobile-app-flutter-23/

Keçən il Flutter-i seçdim və bu günə qədər əla bir səyahət olduğunu söyləməliyəm. Flutter, Android və iOS üçün yüksək keyfiyyətli tətbiqetmələr yaratmaq üçün Google-un əla çərçivəsidir.

Demək olar ki, hər hansı bir tətbiqi hazırlamaqda olduğu kimi, tətbiq vəziyyəti həmişə işlənməlidir. Texniki borc almaqdan çəkinmək üçün dövlət rəhbərliyinin səmərəli şəkildə idarə olunması vacibdir, xüsusən müraciətiniz böyüdükcə və mürəkkəbləşdikdə.

Flutter-də bütün UI komponentləri widgetdır. Zəhmli tətbiqetmənizi yaratmaq üçün bu widgetları tərtib etməyə başladığınızda, dərin bir yuva qurulmuş widgetların ağacı ilə nəticələnəcəksiniz. Bu widget'ların, çox güman ki, tətbiq statuslarını bir-birləri ilə paylaşmaları lazımdır.

Bu məqalə, BLoC naxışından istifadə edərək Flutter-da vəziyyəti necə idarə edəcəyinizi göstərəcəkdir.

Flutter-də vəziyyətin idarə edilməsi müxtəlif yollarla edilə bilər:

İrsi vidjet: Verilənlərin uşaq vidjetlərinə ötürülməsinə imkan verir. Proqram hər dəfə dəyişdikdə widgetlar yenidən yaradılır. InheritedWidget əsas sinifini istifadə etməyin mənfi tərəfi budur ki, statusunuz qəti olur və vəziyyətinizi dəyişdirmək istəyirsinizsə bu problemdir.

Kapsam modeli: Bu, InheritedWidget üzərində qurulan və vəziyyətə daxil olmaq, yeniləmək və dəyişdirmək üçün bir az daha yaxşı bir yol təqdim edən xarici bir paketdir. Bir valideyn modelindən bir məlumat modelini asanlıqla nəsillərinə ötürməyə imkan verir. Bundan əlavə, modeli istifadə edən hər hansı bir uşaq, model yeniləndikdə yenidən tikiləcəkdir.

Bu, bir modelin bir neçə ScopedModelDescendants olduğuna görə bir yeniləmə zamanı yenidən yaradıldığına görə performans problemlərinə səbəb ola bilər.

Bu problem ScopedModel-i bir neçə modelə ayıraraq həll edilə bilər, beləliklə daha ətraflı asılılıqlar əldə edə bilərsiniz. RebuildOnChange bayrağının yalnış olaraq qoyulması da bu problemi həll edir, ancaq hansının yenidən qurulacağına və ya edilməyəcəyinə qərar vermə idrak yükünü gətirir.

Redux: Bəli! React-də olduğu kimi, Flutter-da asanlıqla Redux yaddaş yarada və istifadə edə biləcəyiniz bir Redux paketi var. JavaScript həmkarında olduğu kimi, ümumiyyətlə bir neçə sıra qazan plitəsi kodu və hərəkət və endirimlərin gediş-gəlişi var.

BLoC nümunəsini daxil edin

Business Logic Component (BLoC) modeli Google tərəfindən yaradıldı və Google I / O '18-də elan edildi. BLoC nümunəsi bir tətbiq daxilindəki məlumat axınını idarə etmək üçün reaktiv proqramlaşdırma istifadə edir.

BLoC, tətbiqinizdəki bir məlumat mənbəyi (məsələn, bir API cavabı) ilə verilənlərə ehtiyacı olan widgetlar arasında vasitəçi rolunu oynayır. Mənbədən hadisə / məlumat axınları alır, bütün lazımi iş məntiqlərini işləyir və maraqlanan widgetlardakı dəyişikliklərlə məlumat axınlarını dərc edir.

BLoC iki sadə komponentdən ibarətdir: hər ikisi də StreamController tərəfindən təmin edilən lavabolar və axınlar. Bir lavaboya hadisə / məlumat axınları əlavə edirsiniz və bir axın üzərindəki məlumat axınları kimi eşidirsiniz.

Bir StreamController-a "dart: async" kitabxanası və ya "rxdart" paketi vasitəsilə PublishSubject, ReplaySubject və ya BehaviorSubject kimi daxil olmaq mümkündür.

Aşağıda sadə bir BLoC göstərən kod parçası verilmişdir:

BLoC sadə bir dart sinifidir. Yuxarıdakı kod parçasında bir CounterBloc sinfi və içində bir counterController adlandırdığımız bir StreamController yaratdıq. GetCount adlı yayımımız üçün bir alıcı, çağrıldığı zaman lavabamıza məlumat əlavə edən bir updateCount metodu və StreamController-ı bağlamaq üçün bir atma üsulu yaratdıq.

Axınımızdakı məlumatlara daxil olmaq üçün bir StreamBuilder widgetı yaratdıq və yayımımızı Stream mülkiyyətinə ötürdük və qurucu funksiyasındakı məlumatları əldə etdik.

BLoC-nin tətbiqi

Standart Flutter nümunə tətbiqini BLoC istifadə etmək üçün çeviririk. Davam edək və yeni bir Flutter tətbiqi yaradaq. Terminalınızda aşağıdakı əmri işə salın:

$ flutter bloc_counter && cd bloc_counter yaradın

Proqramı sevdiyiniz redaktorda açın və lib qovluğunda üç fayl yaradın: counter.dart, counter_provider.dart və counter_bloc.dart.

Bizim CounterProvider bir tam və onu artırmaq üçün bir metod ehtiva edir. Aşağıdakı kodu counter_provider.dart faylına əlavə edin:

Class CounterProvider {int count = 0;
void buildCount () => count ++; }

Sonra BLoC sayğacımızı tətbiq edirik. Aşağıdakı kodu counter_block.dart dosyanıza yapışdırın:

CounterBloc sinifimizdə yuxarıdakı nümunə kodumuzun bir hissəsini istifadə etdik. Sətir 7-də CounterProvider sinfimizi yaratdıq və sayını artırmaq üçün updateCount metodunda provayder metodunu çağırdıq. 13-cü sırada nömrəni lavabomuza ötürdük.

Main.dart dosyanızdakı kodu aşağıdakı kodla əvəz edin. Aşağıdakı kodda counter.dart faylımıza köçürdüyümüz standart sayğac kodunun əksəriyyətini sadəcə sildik. İncrementCounter metodu hər dəfə çağırıldıqda sayğacı yeniləyən və lavabomuza əlavə edən BLoC-nin updateCount metodunu çağırırıq.

BLoC'imiz artıq məlumat alır və ötürür. StreamBuilder vasitəsilə bu məlumatlara daxil ola və ekranda göstərə bilərik. Məlumata ehtiyacı olan hər bir widgetı bir StreamBuilder widgetına bağlayırıq və məlumatları ehtiva edən axını keçiririk. Counter.dart faylına aşağıdakı kodu əlavə edin:

Yuxarıdakı kodda əyani bir vidjetimiz var. 13-cü sətirdəki dövlət sinifimizdə blokumuzun Dispose metodunu çağırırıq ki, widget quruluşdan çıxarılsa axın nəzarətçisi bağlana bilər.

19-cu sətirdə bir StreamBuilder widgetını qaytarırıq və 20-ci sətirdə axınınızı və 21-ci sətirdəki ilkin məlumatları ötüririk. 30-cu sətirdə anlıq görüntüdəki məlumatlara daxil oluruq və onu göstəririk.

Aşağıdakı əmri işə salmaqla tətbiqetməni işə salın. Bir emulatorun işlədiyinə əmin olun.

$ flutter run

Tətbiq işləyərkən artı simgesini vurun və hər vuruşda sayğac artımına baxın.

Demo tətbiqi

Birlikdə ən sadə BLoC formasını Flutter-da tətbiq edə bildik. İstifadə vəziyyətinizdən asılı olmayaraq konsepsiya eyni qalır.

Ümid edirəm bu məqaləni faydalı tapdınız. Xahiş edirəm başqalarını tapa bilməsi üçün edin və paylaşın. Suallarla və ya söhbət üçün Twitter @developia_-də məni vurun.