240808~240809 TIL

나고수·2024년 8월 9일
0

2024 TIL

목록 보기
51/94
post-thumbnail

① 배운 것
1. SliverSafeArea가 있어서 전체를 safeArea로 감싸지 않고 특정 sliver widget만 safeare를 적용할 수 있다.
2. sliverappbar을 쓰려면 확장했을때의 크기가 고정일때만 사용가능하다. 왜냐면 expandHeight를 적어야하기 때문이다. 유동적일때는 사용하기 어려움 intrinsic_size_builder 라이브러리가 있지만 정확하지 x
3. listview의 스크롤 비활성 시키려면 primary false를 하면된다.
4. nestedScrollView + TabbarView + 상단바에 이미지가 들어가야하기때문에 safeArea 적용 + 그런데 탭바가 최상단에 붙고 바디가 스크롤 될 때는 safeArea를 적용하지 않아야 하는 뷰 를 구현했어야했다.
이렇게저렇게 해보다가 결국 extended_nested_scroll_view를 사용해서 해결했다.
extended_nested_scroll_view는 nestedScrollView + tabbar 사용 시 여러개의 탭뷰 사이에서 스크롤이 공유되는 플러터 고유의 문제를 해결한 라이브러리이다. pinnedHeaderSliverHeightBuilder 이런 속성도 있어서 평소에는 safeArea가 false이고 SliverPersistentHeader가 최상단에 붙고 바디가 스크롤 될 때 safeArea를 true로 변경하는 이런 식이 아니라 그냥 SliverPersistentHeader가 최상단에 붙으면 pinnedHeaderSliverHeightBuilder 이 영역 아래부터 바디가 스크롤 되는 방식으로 구현 할 수 있었다. 휴😮‍💨 자세한 코드는 노션에 있음

 return Scaffold(
      backgroundColor: const Color(0xffFFF6EE),
      SafeArea(
      top:false,
      bottom:false,
        body: Stack(
          children: [
            DefaultTabController(
              length: 2,
              child: ExtendedNestedScrollView(
                headerSliverBuilder: //스크롤이 가능한 헤더 부분 
                    (BuildContext context, bool innerBoxIsScrolled) {
                  return [
                    SliverToBoxAdapter(
                      child: //항상 스크롤이 될 뷰,
                    SliverPersistentHeader( 
                      pinned: true, // 이부분이 최상단에 도달하면 더이상 헤더는 스크롤 되지 않고 바디만 스크롤 된다.
                      delegate: TabPersistentHeaderDelegate(tabController),
                    ),
                  ];
                },
                pinnedHeaderSliverHeightBuilder: () {
                  return 98; // 이만큼의 스크롤 되지 않는 최상단 공간을 차지하고 그 밑(98 밑)에서부터 바디가 스크롤 된다.
                  //나같은 경우는 safeArea 영역+탭바 영역으로 고정했다.
                },
                onlyOneScrollInBody: true,
                body: //헤더가 최상단에 도달한 이후 스크롤 될 바디 부분 
              ),
            ),
          ),
          

class TabPersistentHeaderDelegate extends SliverPersistentHeaderDelegate {
  final TabController _tabController;

  TabPersistentHeaderDelegate(this._tabController);

  
  double get minExtent => 54; //탭바 height

  
  double get maxExtent => 54; //탭바 height

  
  Widget build(
      BuildContext context, double shrinkOffset, bool overlapsContent) {
    return TabBarView(
      tabController: _tabController,
    );
  }

  
  bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate) {
    return false;
  }
}          

② 회고 (restropective)
한 뷰를 위하여 제대로 된 커밋만 4번 정도했고 그냥 구조를 이렇게 저렇게 변경해 본건 10번이 넘는거같다.
정말 어려운 뷰였다 하지만 포기하지않고 결국 해낸 내가 넘 대단하다 굿굿 ✌️

③ 개선을 위한 방법

profile
되고싶다

0개의 댓글