Sliver위젯들과 함께 복잡?한 스크롤 동작을 구현할 때 사용되곤 한다.
예를 들어 instagram에서 프로필을 보면
이러한 순으로 되어있다.
화면 전체는 스크롤뷰로, 위아래로 스크롤이 되며
탭 바 아이콘 버튼을 누르면 해당하는 게시물 탭을 보여준다.
해당하는 게시물 탭은 m * 3 메트릭스 형태로 되어 있다.
해당하는 게시물을 스크롤 해서 내리다보면 TabBar가 화면 최상단에 걸리게 된다.
이러한 복잡?한 스크롤 동작을 위해서 NestedScrollView를 사용한다.
위의 1~4의 번호 순서로 코드를 작성한다!
return SafeArea(
child: DefaultTabController(
length: 2,
child: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) {
return [ ...
return SafeArea(
child: DefaultTabController(
length: 2,
child: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) {
return [
SliverAppBar(
title: const Text('NYAGU'),
actions: [
IconButton(
onPressed: () {},
icon: const FaIcon(
FontAwesomeIcons.gear,
size: Sizes.size20,
),
),
],
),
return SafeArea(
child: DefaultTabController(
length: 2,
child: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) {
return [
SliverAppBar(
title: const Text('NYAGU'),
actions: [
IconButton(
onPressed: () {},
icon: const FaIcon(
FontAwesomeIcons.gear,
size: Sizes.size20,
),
),
],
),
SliverToBoxAdapter(
child: Column(
children: [ ...이것저것 작성
class PersistentTabBar extends SliverPersistentHeaderDelegate {
Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) {
return Container(
decoration: BoxDecoration( ...
),
child: const TabBar(
indicatorColor: Colors.black,
indicatorSize: TabBarIndicatorSize.label,
labelColor: Colors.black,
tabs: [
Tab( ...
Tab( ...
],
),
);
}
double get maxExtent => 47;
double get minExtent => 47;
bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) {
return false;
}
}
이후 이하와 같이 작성하면 계속 아래로스크롤해도 최상단에 TabBar가 걸리는 스크롤 뷰 완성!
return SafeArea(
child: DefaultTabController(
length: 2,
child: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) {
return [
SliverAppBar( ...
SliverToBoxAdapter( ...
SliverPersistentHeader(
delegate: PersistentTabBar(), pinned: true),
];
},
return SafeArea(
child: DefaultTabController(
length: 2,
child: NestedScrollView(
headerSliverBuilder: (context, innerBoxIsScrolled) {
return [
SliverAppBar( ...
SliverToBoxAdapter( ...
SliverPersistentHeader(
delegate: PersistentTabBar(), pinned: true),
];
},
body: TabBarView(
children: [
GridView.builder( ...
GridView.builder( ...
메트릭스 형태로 표시하는 GridView에 대해서는 다음 포스팅에..
좋은 정보 감사합니다