인스타그램, 당근 마켓, 페이스북과 같이 화면을 계속 스크롤하여 데이터를 불러오는 기능은 정보를 공유하는 앱에서 거의 필수적으로 사용되는 기능 중 하나입니다.
오늘은 Flutter에서 이러한 무한 스크롤을 쉽게 구현할 수 있는 방법과 더불어 새로고침 할 수 있는 기능까지 살펴보려고 합니다.
pull_to_refresh | Flutter Package
a widget provided to the flutter scroll component drop-down refresh and pull up load.
pub.dev
pull_to_refresh
위 주소의 pull_to_refresh 패키지를 사용하면 손쉽게 구현할 수 있습니다.
아래 코드는 위 패키지 Readme를 해석하여 주석을 달은 부분이다. 한번 훑어보면 쉽게 이해가 갈 것이라 생각됩니다.
List<String> items = ["1", "2", "3", "4", "5", "6", "7", "8"]; RefreshController _refreshController = RefreshController(initialRefresh: false); //새로고침 void _onRefresh() async{ await Future.delayed(Duration(milliseconds: 1000)); //1초를 기다린 후 새로고침한다. //이 부분에 새로고침 시 불러올 기능을 구현한다. _refreshController.refreshCompleted(); } //무한 스크롤 void _onLoading() async{ await Future.delayed(Duration(milliseconds: 1000)); //1초를 기다린 후 새로운 데이터를 불러온다. //이부분에 데이터를 계속 불러오는 기능을 구현한다. //리스트뷰를 사용한다면 간단한 예로 list.add를 이용하여 데이터를 추가시켜준다. _refreshController.loadComplete(); } @override Widget build(BuildContext context) { return Scaffold( body: SmartRefresher( enablePullDown: true, // 아래로 당겨서 새로고침 할 수 있게 할건지의 유무를 결정 enablePullUp: true, // 위로 당겨서 새로운 데이터를 불러올수 있게 할건지의 유무를 결정 // 이 부분은 'header' 즉 머리뿐으로써, 새로고침시 로딩결과에 따라 어떠한 글자를 띄워 줄지 정의 할 수 있다. header: CustomHeader( builder: (BuildContext context, RefreshStatus? mode) { Widget body; if (mode == RefreshStatus.idle) { body = Text(''); } else if (mode == RefreshStatus.refreshing) { body = CupertinoActivityIndicator(); } else { body = Text(''); } return Container( height: 55.0, child: Center(child: body), ); }, ), // 이 부분은 'footer' 번역하면 바닥글이란 의미인데 무한스크롤시 로딩결과에 따라 어떠한 글자를 띄워 줄지를 정의할수있다. footer: CustomFooter( builder: (BuildContext context,LoadStatus mode){ Widget body ; if(mode==LoadStatus.idle){ body = Text("pull up load"); } else if(mode==LoadStatus.loading){ body = CupertinoActivityIndicator(); } else if(mode == LoadStatus.failed){ body = Text("Load Failed!Click retry!"); } else if(mode == LoadStatus.canLoading){ body = Text("release to load more"); } else{ body = Text("No more Data"); } return Container( height: 55.0, child: Center(child:body), ); }, ), controller: _refreshController, onRefresh: _onRefresh, // 새로고침을 구현한 함수 onLoading: _onLoading, // 무한스크롤을 구현한 함수 child: ListView.builder // 리스트뷰 itemBuilder: (c, i) => Card(child: Center(child: Text(items[i]))), itemExtent: 100.0, itemCount: items.length, ), ), ); }
pull_to_refresh는 ListView 뿐만 아니라 GridView와 같은 모든 Scroll Widget에 사용이 가능합니다.
'ETC > Flutter' 카테고리의 다른 글
[Flutter] CocoaPods's specs repository is too out-of-date to satisfy dependencies error (0) | 2022.01.13 |
---|---|
[flutter,dart] List의 filled/generate 생성자 (0) | 2021.12.29 |
[flutter] listView Scroller disable(리스트 뷰 스크롤 막기) (0) | 2021.12.06 |
[flutter] 서버로 이미지 업로드 하기(Dio, image_picker) (0) | 2021.11.30 |
[flutter] tabar&tabbar view 스와이프 제한하기 (0) | 2021.11.23 |
[flutter] 간단한 막대그래프 구현하기(리뷰 그래프) - vertical_barchart (0) | 2021.11.23 |
댓글