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;
}
}


SliverPersistentHeader ⇒ 노란색 영역
minHeight: 50,
스크롤 반응 시 최소 영역 값maxHeight: 150,
스크롤 반응 시 초대 영역 값 , 초기 영역 값Share article