https://flutter.dev/docs/development/ui/advanced/slivers
A 50-minute episode of The Boring Show where Ian Hickson, Flutter’s Tech Lead, and Filip Hracek discuss the power of slivers.
flutter Tech Lead, Ian Hickson
와Filip Hracek
함께 slivers power에 대해 논의하는 50분 에피소드 영상- 좀 더 자세히 이야기를 듣고 이해하고싶다면 무조건 영상보는 것을 추천
- 단순 사용하고 끝이 아닌 이해할려고 영상을 짧게 봤는데 꿀팁 등 좋은 내용이 많이 담겨 있어서 요약해서 작성해보려고 합니다. (오번역 발견 시 댓글 남겨주세요! 👀)
Slivers이 무엇인지 알기 전에,
일반적으로 flutter가 레이아웃을 어떻게 처리하는지 알아봅시다
= 위 배치 방식은 box에선 잘 돌아갑니다.
= 스크롤에 적합하지않습니다.
(특히 appbar 및 기타 별난 스크롤 효과와 같은 작업을 할때)
요약
SliverAppBar
, right.우리가 할일은 우선
AppBar
->SliverAppBar
사용해보기!
=SliverAppBar
는 기본적으로AppBar
와 동일하게 작동합니다. (argments 등 관점으로)+ 06:26 😂
What happens if we use the SliverAppBar first of all?
IAN: It's not going to be happy at all.
SliverAppBar
실 사용 예제는 CustomScrollView 문서에 있습니다.
Scaffold 제거합니까?
CustomScrollView
안에 SliverAppBar
넣어야 함CustomScrollView
보다 바깥에 있는 Scaffold 자리에 넣게 되면 스크롤링 안되고 어떻게 작동할지 모르게 됨)children
slivers
instead of childrenchildren
을 많이 쓰지만 여기선 Sliver
가 부모이니 slivers
단어 사용[sample]
CustomScrollView(
slivers: <Widget>[
const SliverAppBar(
pinned: true,
expandedHeight: 250.0,
flexibleSpace: FlexibleSpaceBar(
title: Text('Demo'),
),
),
list를 만들려면
SliverList
사용해야합니다.
=SliverList
는 기본적으로ListView
와 동일한 args가 있습니다.
SliverChildBuilderDelegate(builder)
= ListViewBuilder와 같은 builderSliverChildListDelegate(children)
= 실제 widget list를 갖고있는 목록 (children)List variant 보다 Builder variant를 사용할 것
childCount
명시해 줄 것
...
SliverGrid(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 200.0,
mainAxisSpacing: 10.0,
crossAxisSpacing: 10.0,
childAspectRatio: 4.0,
),
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
return Container(
alignment: Alignment.center,
color: Colors.teal[100 * (index % 9)],
child: Text('Grid Item $index'),
);
},
childCount: 20,
),
),
...
pinned:true
항상 목록 맨위에 유지되고 스크롤 내리면 그림자까지 구현 (TMI. 구현하는데 며칠걸림)floating:true
pinned 설정 빼고 floating true 해놓을 경우 스크롤을 아래로 내릴 경우 없어지고 위로 올리면 다시 나왔다가 또 다시 내리면 사라지는 기능expandedHeight: 200
appBar가 크기만큼 확장되고 스크롤 내릴 경우 크기가 줄어든다. flexibleSpace: Widget()
expanded 크기 만큼 그 위 나타날 위젯 (보통 이미지를 넣어서 사용)return CustomScrollView(
slivers: [
SliverAppBar(
floating: true,
expandedHeight: 200,
flexibleSpace: Placeholder(),
),
],
);
여태 sliver는 outside로, 예외적으로 inside 가져가는 Sliver는?
= The main example is
SliverPadding
.
Padding
위젯과 유사하게 작동합니다.- SliverList를 래핑할 수도 있습니다.
sliver중 가장 심플한 Sliver는?
= That's the simplest Sliver, a
SliverToBoxAdapter
.
- 내부에 box가 있어야하므로 원하는 child를 넣을 수 있습니다.
OK, so all right, I think we covered SliverAppBar and, like the crazy things that you can do with Slivers.
Let's create our own Sliver.
SliverToBoxAdapter
가 제일 쉬운 방법이니깐 SliverToBoxAdapter
구현체 소스코드 보고 copy and paste하고 새 class 만들어서 원하는 부분 수정하면서 실험하십니다. 내부 소스코드 보면서 지속적으로 캐시며 페인팅이며 설명해주십니다. 그럼 다음번엔 Sliver 이론말고 실제 사용하는 소스코드 위주 포스팅으로 찾아뵙겠습니다.
좋아요와 댓글로 많이 의견 남겨주세요🙋🏻♀️❤️
안녕하세요. listview.builder를 사용하여 이미지(네트워크에서 불러온 이미지)를 불러올때 스크롤을 아래로 내렸다가 올리면 지연로딩이라고 해야하나요 이미지를 캐시하지 못하고 사라진이미지가 늦게뜨는데 이걸 해결할 방법이 있나요? (인스타그램을 보면 스크롤 막 내려닸가 올려도 이미지는 계속 노출되고있는거처럼)
제가 사용해본방법은
1. AutomaticKeepAliveClientMixin 사용했는데 안먹힘.
2. listview.builder내 cacheExtent 사용했는데 안먹힘.
3. addAutomaticKeepAlives: true 안먹힘.
*이미지 용량이 크면 lazy로딩이 발생되는거 같긴한데..해결할 방법이 없네요..
-ㅂ-)b