Tutorial Flutter Membuat Infinite Load Data Dari Api Dengan Bloc Pattern
ยทยท9 min read
TABLE OF CONTENT
Halo apa kabar semua? kali ini Aku akan membahas tentang Tutorial Membuat Infinite List Load Data dari API menggunakan Bloc Pattern, jangan berlama-lama lagi ayo kita mulai sebuah experiments.
Untuk memulai experiment kali ini teman-teman harus mempunyai beberapa requirement yang harus dipenuhi yaitu:
Flutter SDK
Text Editor/IDE (Android Studio, VS Code)
Extensions Dart & FLutter
Jika teman-teman belum bisa memenuhi beberapa kriteria tersebut bisa terlebih dahulu melengkapinya, berikut link dokumentasi di Flutter.dev.
Saya anggap tahapan tersebut sudah terpenuhi ya.
Mari kita membuat sebuah project baru Flutter kita kali ini dengan nama flutter_infinite.
1
flutter create flutter_infinite
Teman-teman bisa menggunakan command perintah tersebut bila ingin membuat project lewat CLI/CMD, atau bisa juga lewat langsung di IDE tanpa mengetikkan command tersebut.
Tunggu sampai project pembuatan project selesai, kemudian open ke Text Editor atau IDE teman masing-masing.
Setelah selesai ada beberapa library atau dependency yang harus kalian install di project Flutter kalian berikut daftar nya:
Pada saat menulis blog ini versi dependency tersebut, Mungkin teman-teman pada saat membaca ini versi bisa saja berubah. Saran aku gunakan versi terbaru dari versi tersebut, jika ada pembaruan. Dan jangan lupa jalankan perintah flutter pub get untuk menginstallnya.
Pada kesempatan ini aku ingin mencoba menggunakan data dari https://jsonplaceholder.typicode.com/ , untuk data dari API ini hanya optional saja, sesuaikan dengan data dari teman-teman aja ya?…
Langkah selanjutnya kita buat dulu sebuah Bloc Pattern nya sebagai state managementnya. Teman-teman bisa menggunakan extensions flutter_bloc generator support di VS Code dan Android Studio. Ini sifatnya hanya opsi saja, karena ini tools saja yang berguna untuk mempermudahkan.
Jika teman-teman menggunakan extension bloc generator, teman-teman tinggal Klik Kanan>Bloc: New Bloc> {Isi nama Bloc nya}. Tapi pada kali ini saya kasih nama Bloc nya yaitu InifiniteLoad. Berikut hasil kode yang telah di generaten.
part of'infinite_load_bloc.dart';abstractclassInfiniteLoadEventextendsEquatable{constInfiniteLoadEvent();}
infinite_load_state.dart
1
2
3
4
5
6
7
8
9
10
part of'infinite_load_bloc.dart';abstractclassInfiniteLoadStateextendsEquatable{constInfiniteLoadState();}classInfiniteLoadInitialextendsInfiniteLoadState{@overrideList<Object>getprops=>[];}
Langkah selanjutnya kita buat data model terlebih dahulu, teman-teman bisa menggunakan tool dari QuickType Json to Dart. Pada kali ini saya akan menggunakan endpoint http://jsonplaceholder.typicode.com/photos ini. Untuk membuat Data model menggunakan generator dari QuickType, buka dulu link API nya terus copy content JSON API, ke app.quicktype.io. Terus jadi deh.
Berikut hasil generate dari JSON ke data model dart:
Setelah itu kita buat file terlebih dahulu dengan nama photo_repository.dart. Untuk request dari client ke server API. Berikut code dari PhotoRepository:
Pada endpoint tersebut JSON placeholder menyediakan params start dan limit untuk membuat pagination. Maka dari itu bisa digunakan sebagai experiment kali ini untuk membuat infinite load scrollview.
Pada langkah kali ini kita telah berhasil membuat Bloc, Data Model, dan Repository.
Oh, ya untuk Bloc yang telah digenerate sifatnya masih abstract, belum kita implement semua fungsinya, berikut hasilnya:
part of'infinite_load_bloc.dart';abstractclassInfiniteLoadStateextendsEquatable{constInfiniteLoadState();@overrideList<Object>getprops=>[];}classInfiniteLoadLoadingextendsInfiniteLoadState{}classInfiniteLoadMoreLoadingextendsInfiniteLoadState{}classInfiniteLoadLoadedextendsInfiniteLoadState{finalList<PhotosModel>data;finalintcount;InfiniteLoadLoaded({@requiredthis.data,@requiredthis.count});@overrideList<Object>getprops=>[data,count];}classInfiniteLoadErrorextendsInfiniteLoadState{}
infinite_load_event.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
part of'infinite_load_bloc.dart';abstractclassInfiniteLoadEventextendsEquatable{constInfiniteLoadEvent();@overrideList<Object>getprops=>[];}classGetInfiniteLoadextendsInfiniteLoadEvent{}classGetMoreInfiniteLoadextendsInfiniteLoadEvent{finalintstart,limit;GetMoreInfiniteLoad({@requiredthis.start,this.limit});@overrideList<Object>getprops=>[start,limit];}
Sekarang tinggal implement semua di main.dart, untuk lokasi penempatan sesuaikan dengan kasus teman-teman aja, tapi kalau ingin mengikuti tutorial ini boleh aja di samain.
Pertama kita buat dulu Bloc Providernya sebelum kita menjalankan Bloc Buildernya. Taruh BlocProvider di parent BlocBuilder boleh di widget root project ataupun parentnya. Dengan menggunakan Struktur seperti ini:
Pada kasus tersebut pada saat initialisasi BlocProvider saya langsung panggil event yaitu GetInfiniteLoad. Dan pada contoh kali ini saya hanya fokus pada file main.dart saja , maka saya taruh BlocProvider di widget root project.
Note: Penempatan BlocProvider pada root project seperti di atas state di simpan di semua page project, bila teman-teman ingin hanya spesifik yang boleh akses maka taruh BlocProvider di parent tingkat satu atau lebih, yang penting tidak bisa di akses di widget yang dikecualikan.
classMyHomePageextendsStatefulWidget{@override_MyHomePageStatecreateState()=>_MyHomePageState();}class_MyHomePageStateextendsState<MyHomePage>{InfiniteLoadBloc_bloc;int_currentLenght;List<PhotosModel>_data=[];void_loadMoreData(){_bloc.add(GetMoreInfiniteLoad(start:_currentLenght,limit:10));}@overridevoidinitState(){_bloc=BlocProvider.of<InfiniteLoadBloc>(context);super.initState();}@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:Text('Infinite Load ScrollView'),),body:BlocBuilder<InfiniteLoadBloc,InfiniteLoadState>(builder:(context,state){if(stateisInfiniteLoadLoaded||stateisInfiniteLoadMoreLoading){if(stateisInfiniteLoadLoaded){_data=state.data;_currentLenght=state.count;}return_buildListPhotos(state);}elseif(stateisInfiniteLoadLoading){returnCenter(child:CircularProgressIndicator());}else{returnText('Error');}},),);}Widget_buildListPhotos(InfiniteLoadStatestate){returnLazyLoadScrollView(child:ListView(children:[ListView.builder(shrinkWrap:true,itemCount:_data.length,physics:NeverScrollableScrollPhysics(),itemBuilder:(_,i){returnPhotoItem(data:_data[i]);}),// Loading indicator more load data
(stateisInfiniteLoadMoreLoading)?Center(child:CircularProgressIndicator()):SizedBox(),],),onEndOfPage:_loadMoreData,);}}
Untuk memanggil suatu event pada Bloc, Anda perlu menggunakan keyword/method add().
Jika Bloc variable belum di deklarasikan terlebih dahulu bisa langsung menggunakan cara ini:
Bila Anda seorang developer yang ingin mencoba belajar sesuatu teknologi yang baru, Anda tidak salah lagi bila ingin belajar Flutter, disini saya akan membahas alasan-alasan kenapa harus pakai Flutter.
Comment: