SliverToBoxAdaptor, SliverPersistentHeader

샤워실의 바보·2024년 2월 11일
0
post-thumbnail

SliverToBoxAdapter는 Flutter에서 CustomScrollView와 같은 슬리버를 사용하는 스크롤 가능한 영역에서 일반적인 위젯을 사용할 수 있게 해주는 특별한 위젯입니다. 이를 사용함으로써, 슬리버가 아닌 일반 위젯을 슬리버 리스트 안에 넣을 수 있습니다.

SliverToBoxAdapter의 역할

  • 슬리버 아닌 위젯 사용: CustomScrollViewSliverAppBar, SliverList, SliverGrid와 같은 슬리버 위젯들을 자식으로 가질 수 있습니다. 하지만, 때때로 일반 위젯(예: Container, Column, Row)을 이런 스크롤 가능한 리스트에 넣고 싶을 수 있습니다. SliverToBoxAdapter를 사용하면 이를 가능하게 합니다.

  • 간단한 포함: SliverToBoxAdapter 안에 일반 위젯을 넣으면, 그 위젯은 슬리버 리스트의 일부처럼 스크롤 됩니다.

사용 예시

CustomScrollView(
  slivers: <Widget>[
    SliverAppBar(
      // ... SliverAppBar 설정
    ),
    SliverToBoxAdapter(
      child: Container(
        height: 200.0,
        color: Colors.blue,
        child: Center(
          child: Text("일반 위젯"),
        ),
      ),
    ),
    SliverList(
      // ... SliverList 설정
    ),
  ],
)

이 예시에서 SliverAppBarSliverList 사이에 Container 위젯을 SliverToBoxAdapter로 감싸서 사용하고 있습니다. 이렇게 하면 Container는 슬리버 리스트의 일부처럼 스크롤 되며, 전체적인 레이아웃을 유연하게 구성할 수 있습니다.

요약

SliverToBoxAdapterCustomScrollView와 같은 슬리버 기반의 스크롤 가능한 리스트에서 일반 위젯을 사용할 수 있게 해주는 유용한 위젯입니다. 이를 통해 슬리버가 아닌 위젯을 스크롤 가능한 리스트의 일부로 포함시킬 수 있습니다.

SliverToBoxAdapter는 Flutter에서 매우 유용한 위젯 중 하나입니다. 기본적으로, CustomScrollViewSliver 위젯들만 자식으로 받아들입니다. 그런데 때로는 일반적인 위젯(예: Container, Column, Row 등)을 CustomScrollView 안에 넣고 싶을 때가 있습니다. 이런 경우 SliverToBoxAdapter를 사용하여 일반 위젯을 Sliver로 변환할 수 있습니다.

사용 예제:

CustomScrollView(
  slivers: <Widget>[
    SliverAppBar(
      title: Text('SliverToBoxAdapter 예제'),
    ),
    SliverToBoxAdapter(
      child: Container(
        height: 200.0,
        color: Colors.red,
        child: Center(
          child: Text('이것은 일반 Container입니다.'),
        ),
      ),
    ),
    // 여기에 다른 slivers를 계속 추가할 수 있습니다.
  ],
)

위 예제에서 SliverToBoxAdapterContainerCustomScrollView 내에 포함시키기 위해 사용되었습니다.

주의사항:

  • SliverToBoxAdapter를 사용할 때는 내부에 있는 위젯의 크기가 고정되어 있어야 합니다. 만약 그렇지 않다면 오류가 발생할 수 있습니다.
  • 크기가 동적으로 변경되는 위젯을 사용하려면 다른 방법을 고려해야 합니다 (예: SliverListSliverGrid 등을 사용).

요약하면, SliverToBoxAdapterCustomScrollView 내에서 일반 위젯을 사용할 때 필요한 브리지 역할을 하는 위젯입니다.

  1. SliverToBoxAdapter:

    SliverToBoxAdapter는 기본적으로 일반적인 위젯(Box 위젯)을 sliver 위젯으로 변환하는 데 사용됩니다. 일반적인 위젯을 CustomScrollView 안에서 사용하고자 할 때, 이 위젯을 사용해서 변환해주어야 합니다.

    예를 들어, Column이나 Container와 같은 일반적인 위젯을 CustomScrollView에 바로 추가할 수 없습니다. 그러나 SliverToBoxAdapter를 사용하면 이러한 위젯을 추가할 수 있게 됩니다.

    SliverToBoxAdapter(
      child: Column(
        children: const [
          CircleAvatar(
            backgroundColor: Colors.red,
            radius: 20,
          )
        ],
      ),
    )

    위 코드에서는 CircleAvatar를 포함하는 ColumnCustomScrollView에 추가하기 위해 SliverToBoxAdapter를 사용하였습니다.

  2. SliverPersistentHeader:

    SliverPersistentHeader는 스크롤 가능한 영역 내에서 헤더가 계속 화면에 보이도록 하는 역할을 합니다. 이 위젯은 delegate 속성을 통해 구성되며, SliverPersistentHeaderDelegate를 확장하는 클래스를 제공하여 사용자 지정 헤더를 정의할 수 있습니다.

    SliverPersistentHeader(
      delegate: CustomDelegate(),
      floating: true,
    )
    • floating: 헤더가 스크롤 다운(위로 스크롤) 시 바로 나타나게 할 것인지 결정합니다.

    CustomDelegate 클래스에서는 여러 메서드와 속성들이 정의되어 있습니다:

    • build: 실제 헤더 위젯을 생성합니다.
    • maxExtent: 헤더의 최대 높이를 지정합니다.
    • minExtent: 헤더의 최소 높이를 지정합니다.
    • shouldRebuild: 헤더를 다시 빌드해야 하는지 결정하는 데 사용됩니다.

    위 코드에서 CustomDelegate는 커스텀 헤더를 정의하는 데 사용되며, Container 위젯을 통해 헤더 내용을 표시합니다.

요약하면, SliverToBoxAdapter는 일반 위젯을 sliver로 변환하는 역할을 하며, SliverPersistentHeader는 사용자 지정 헤더를 제공하는 역할을 합니다. 이러한 sliver 위젯들은 CustomScrollView 내에서 사용되어 효과적인 스크롤 뷰를 구성할 수 있게 합니다.

물론이죠, 코드에 따라 자세하게 설명하겠습니다.

  1. CustomScrollView:
    UserProfileScreenbuild 메서드 내에서 CustomScrollView를 사용합니다. CustomScrollView는 여러 개의 sliver 위젯을 통합하여 사용하기 위한 스크롤 가능한 뷰를 제공합니다.

  2. SliverAppBar:

    SliverAppBar(
       stretch: true,
       backgroundColor: Colors.teal,
       collapsedHeight: 80,
       expandedHeight: 200,
       flexibleSpace: FlexibleSpaceBar(
         ...
       ),
    )
    • collapsedHeight: 앱 바가 축소될 때의 높이를 지정합니다.
    • expandedHeight: 앱 바가 확장될 때의 최대 높이를 지정합니다.
    • flexibleSpace: 확장 및 축소되는 영역에서 어떻게 보여질지를 정의하는 위젯입니다.
  3. SliverToBoxAdapter:

    SliverToBoxAdapter(
       child: Column(
         children: const [
           CircleAvatar(
             backgroundColor: Colors.red,
             radius: 20,
           )
         ],
       ),
    )

    SliverToBoxAdapter는 일반 위젯(여기서는 Column)을 sliver로 변환하여 CustomScrollView에 포함시킬 수 있게 해줍니다.

  4. SliverFixedExtentList:

    SliverFixedExtentList(
       ...
       itemExtent: 100,
    )

    이 위젯은 각 항목의 고정된 높이(itemExtent)를 가진 목록을 생성합니다.

  5. SliverPersistentHeader:

    SliverPersistentHeader(
       delegate: CustomDelegate(),
       floating: true,
    )
    • delegate: SliverPersistentHeaderDelegate를 확장하여 커스텀 헤더의 동작 및 디자인을 정의합니다.
    • floating: true로 설정하면 사용자가 위로 스크롤할 때 헤더가 바로 나타납니다.
  6. SliverGrid:

    SliverGrid(
       ...
       gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
         ...
       ),
    )

    SliverGrid는 그리드 레이아웃을 생성합니다. 여기서 사용된 SliverGridDelegateWithMaxCrossAxisExtent는 각 그리드 항목의 최대 크로스 축 길이를 지정하여 그리드 항목의 크기와 배치를 제어합니다.

  7. CustomDelegate:

    class CustomDelegate extends SliverPersistentHeaderDelegate {
       ...
    }

    이 클래스는 SliverPersistentHeaderdelegate를 위한 커스텀 클래스입니다. 여기서 헤더의 레이아웃과 어떻게 보여질지를 정의하며, 최소 및 최대 높이도 지정합니다.

profile
공부하는 개발자

0개의 댓글