슬리버2

김인범's avatar
Jan 13, 2025
슬리버2
import 'package:flutter/material.dart'; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: HomePage(), ); } } // Sliver : 찢어진 조각 << 스크롤에 반응 할 수 있다. class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: CustomScrollView( // 요 안에만 슬리버 넣을 수 있다. slivers: [ SliverAppBar( title: Text("앱바1"), pinned: false, floating: true, // floating & snap 쌍을 이룬다. snap: true, expandedHeight: 250, flexibleSpace: FlexibleSpaceBar( title: Text("플렉시블 스페이스"), centerTitle: true, background: Image.network( "https://picsum.photos/200/300", fit: BoxFit.cover, ), ), ), SliverToBoxAdapter( child: Container(color: Colors.blue, height: 300), ), SliverPersistentHeader( pinned: true, floating: false, delegate: MySliverPersistentHeaderDelegate( minHeight: 50, maxHeight: 150, child: Container( color: Colors.yellow, ), ), ), SliverList( delegate: SliverChildBuilderDelegate( childCount: 30, (context, index) { return ListTile( title: Text("제목 $index"), ); }, ), ), // SliverFillRemaining( // child: Container( // color: Colors.red, // ), // ) ////////////////////// ], ), ); } } class MySliverPersistentHeaderDelegate extends SliverPersistentHeaderDelegate { MySliverPersistentHeaderDelegate({ required this.minHeight, required this.maxHeight, required this.child, }); final double minHeight; final double maxHeight; final Widget child; @override Widget build( BuildContext context, double shrinkOffset, bool overlapsContent) { return child; } @override double get maxExtent => maxHeight; // getter @override double get minExtent => minHeight; @override bool shouldRebuild(covariant MySliverPersistentHeaderDelegate oldDelegate) { return true; } }
notion image
notion image
SliverPersistentHeader ⇒ 노란색 영역
minHeight: 50, 스크롤 반응 시 최소 영역 값
maxHeight: 150, 스크롤 반응 시 초대 영역 값 , 초기 영역 값
 
Share article

taker