// 1
// 기본 렌더링법
Widget renderSimple() {
return SingleChildScrollView(
child: Column(
children: rainbowColors
.map(
(e) => renderContainer(
color: e,
),
)
.toList(),
),
);
}
// 2
// 화면을 넘어가지 않아도 스크롤 되게하기
Widget renderAlwaysScroll() {
return SingleChildScrollView(
// NeverScrollableScrollPhysics - 스크롤 안됨
physics: AlwaysScrollableScrollPhysics(),
child: Column(
children: [
renderContainer(color: Colors.black),
],
),
);
}
// 3
// 위젯이 잘리지 않게 하기
Widget renderClip() {
return SingleChildScrollView(
clipBehavior: Clip.none,
physics: AlwaysScrollableScrollPhysics(),
child: Column(
children: [
renderContainer(color: Colors.black),
],
),
);
}
// 4
// 여러가지 physics 정리
Widget renderPhysics() {
return SingleChildScrollView(
// BouncingScrollPhysics - iOS 스타일
// ClampingScrollPhysics - Android 스타일
physics: ClampingScrollPhysics(),
child: Column(
children: rainbowColors
.map(
(e) => renderContainer(
color: e,
),
)
.toList(),
),
);
}
// 5
// SingleChildScrollView 퍼포먼스
Widget renderPerformance(){
return SingleChildScrollView(
child: Column(
children: numbers
.map(
(e) => renderContainer(
color: rainbowColors[e % rainbowColors.length],
index: e,
),
)
.toList(),
),
);
}
Widget renderContainer({
required Color color,
int? index,
}) {
if(index != null){
print(index);
}
return Container(
height: 300,
color: color,
);
}
}
SingleChildScrollView : 한 번에 모든 값인 100번까지 모두 렌더링됩니다.
리소스가 많이 필요하면 SingleChildScrollView 퍼포먼스는 좋지 않습니다.
SingleChildScrollView physics와 퍼포먼스를 높이는 방법을 더 알아보겠습니다.
class ListViewScreen extends StatelessWidget {
final List<int> numbers = List.generate(100, (index) => index);
ListViewScreen({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return MainLayout(
title: 'ListViewScreen',
body: renderSeparated(),
);
}
// 1
// 기본 - 모두 한번에 그림
Widget renderDefault() {
return ListView(
children: numbers
.map(
(e) => renderContainer(
color: rainbowColors[e % rainbowColors.length],
index: e,
),
)
.toList(),
);
}
// 2
// 보이는것만 그림
Widget renderBuilder() {
return ListView.builder(
itemCount: 100,
itemBuilder: (context, index) {
return renderContainer(
color: rainbowColors[index % rainbowColors.length],
index: index,
);
},
);
}
// 3
// 2 + 중간 중간에 추가할 위젯 넣을 수 있음
Widget renderSeparated(){
return ListView.separated(
itemCount: 100,
itemBuilder: (context, index) {
return renderContainer(
color: rainbowColors[index % rainbowColors.length],
index: index,
);
},
separatorBuilder: (context, index) {
index += 1; //맨 위는 separator 해당하지 않도록
// 5개의 item마다 배너 보여주기
if(index % 5 == 0){
return renderContainer(
color: Colors.black,
index: index,
height: 100,
);
}
return SizedBox(height: 32,);
},
);
}
Widget renderContainer({
required Color color,
required int index,
double? height,
}) {
print(index);
return Container(
height: height ?? 300,
color: color,
child: Center(
child: Text(
index.toString(),
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w700,
fontSize: 30.0,
),
),
),
);
}
}
class GridViewScreen extends StatelessWidget {
List<int> numbers = List.generate(100, (index) => index);
GridViewScreen({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return MainLayout(
title: 'GridViewScreen',
body: renderMaxExtent(),
);
}
// 1
// 한번에 다 그림!
Widget renderCount() {
return GridView.count(
crossAxisCount: 2,
crossAxisSpacing: 12.0,
mainAxisSpacing: 12.0,
children: numbers
.map(
(e) => renderContainer(
color: rainbowColors[e % rainbowColors.length],
index: e,
),
)
.toList(),
);
}
// 2
// 화면에 보이는 것만 그림
Widget renderBuilderCrossAxisCount(){
return GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 12.0,
mainAxisSpacing: 12.0,
),
itemBuilder: (context, index) {
return renderContainer(
color: rainbowColors[index % rainbowColors.length],
index: index,
);
},
itemCount: 100,
);
}
// 3
// 최대 사이즈 220
Widget renderMaxExtent(){
return GridView.builder(
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
maxCrossAxisExtent: 220,
),
itemBuilder: (context, index) {
return renderContainer(
color: rainbowColors[index % rainbowColors.length],
index: index,
);
},
itemCount: 100,
);
}
Widget renderContainer({
required Color color,
required int index,
double? height,
}) {
print(index);
return Container(
height: height ?? 300,
color: color,
child: Center(
child: Text(
index.toString(),
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.w700,
fontSize: 30.0,
),
),
),
);
}
}
이번에 ScrollView 기본을 다루었고,
다음에 ScrollView 심화 학습을 정리해보겠습니다.