SingleChildScrollView
๐ฌ SingleChildScrollView๋ ํ๋์ ์์ ์์ ฏ๋ง ๊ฐ์ง ์ ์๋ค.
๐ฌ Column์ ์์ ์์ ฏ์ผ๋ก ์ค์ ํ๋ฉด ํ์ํ ์์ ฏ์ ํฌ๊ธฐ๋งํผ ๊ฐ๋ก ๊ธธ์ด๋ฅผ ๊ฐ์ง๋ฉฐ, ListBody๋ฅผ ์ฌ์ฉํ๋ฉด ์คํฌ๋กค ๊ฐ๋ฅ ์์ญ์ด ๊ฐ๋ก๋ก ๊ฝ ์ฐจ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ์คํฌ๋กคํ๊ธฐ ๋ ์ฌ์์ง๋ค.
์์
final items = List.generate(100, (i) => i).toList(); // 0๋ถํฐ 99๊น์ง์ ๊ฐ์ ๊ฐ๋ ๋ฆฌ์คํธ ์์ฑ
SingleChildScrollView(
child: ListBody(
children: items.map((i) => Text('$i')).toList(),
),
),
ListView, ListTile
๐ฌ SingleChildScrollView์ ListBody์ ์กฐํฉ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ๋ด์ง๋ง, ์ข ๋ ๋ฆฌ์คํธ ํํ์ ์ต์ ํ๋ ์์ ฏ์ด๋ค.
๐ฌ ListTile ์์ ฏ์ ์ฌ์ฉํ์ฌ ๋ฆฌ์คํธ ์์ดํ ์ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
๐ฌ ListView์ children ํ๋กํผํฐ์ ๋ค์์ ์์ ฏ์ ๋ฐฐ์นํ๋ฉด ์ ์ ์ธ ๋ฆฌ์คํธ๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
๐ฌ ListTile ์์ ฏ
โฝ ์์ด์ฝ์ด๋ ๊ธ์๋ฅผ leading (์ผ์ชฝ), title (์ค์), trailing (์ค๋ฅธ์ชฝ)์ ์์น์ํฌ ์ ์๋ค.
โฝ onTap ํ๋กํผํฐ์๋ ๋ฆฌ์คํธ์ ํญ๋ชฉ์ ํฐ์นํ์ ๋ ์คํํ๋ ๋์์ ์ ์ํ๋ค.
์์
ListView(
scrollDirection: Axis.vertical,
children: <Widget>[
ListTile(
leading: Icon(Icons.home),
title: Text('Home'),
trailing: Icon(Icons.navigate_next),
onTap: () { },
),
ListTile(
leading: Icon(Icons.event),
title: Text('Event'),
trailing: Icon(Icons.navigate_next),
onTap: () { },
),
ListTile(
leading: Icon(Icons.camera),
title: Text('Camera'),
trailing: Icon(Icons.navigate_next),
onTap: () { },
),
],
),
List.generate
List.generate(
itemList.length,
(index) => _buildItem(itemList[index]),
),
โฝ length ๊ธธ์ด๋งํผ 0๋ถํฐ index - 1๊น์ง ๋ฒ์์ ๊ฐ ์ธ๋ฑ์ค๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ํธ์ถํ์ฌ ๋ง๋ ๊ฐ์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ์์ฑ
ListView.separated
ListView.separated(
separatorBuilder: (context, index) => Divider(
height: 0,
indent: 16, // ๊ตฌ๋ถ์ ์๋ถ๋ถ margin
endIndent: 16, // ๊ตฌ๋ถ์ ๋ท๋ถ๋ถ margin
color: Colors.grey,
),
itemBuilder: (context, index) {
return Item(
item: itemList[index]
);
},
itemCount: itemList.length,
),
โฝ ListView ์์ดํ ๋ค ์ฌ์ด์ ๊ตฌ๋ถ์ ์ ์ฃผ๋ ์์ ฏ์ ์ค์ ํ ์ ์๋ค.
CheckboxListTile
๐ฌ ์ฒดํฌ๋ฐ์ค๊ฐ ์๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
CheckboxListTile(
title: const Text('Animate Slowly'),
secondary: const Icon(Icons.hourglass_empty),
value: _check,
onChanged: (value) {
setState(() {
_check = value;
}
},
),
SwitchListTile
๐ฌ ํ ๊ธ์ด ์๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
SwitchListTile(
title: const Text('Light'),
secondary: const Icon(Icons.lightbulb_outline),
value: _lights,
onChanged: (value) {
setState(() {
_lights = value;
}
},
),
ExpansionPanelList
๐ฌ ์ ์๋ค ํผ ์ ์๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
ExpansionPanelList(
expansionCallback: (int index, bool isExpanded) {
action(index, isExpanded);
},
children: _data.map<ExpansionPanel>((Item item) {
return ExpansionPanel(
headerBuilder: (BuildContext context, bool isExpanded) {
return _header(item);
},
body: _body(item),
isExpanded: item.isExpanded,
);
}).toList(),
);
'Flutter > Concept' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Flutter ] ์คํธ๋ฆผ (0) | 2022.02.27 |
---|---|
[ Flutter ] ํ๋ฉด ํ์ (0) | 2022.02.27 |
[ Flutter ] ํ ์คํธ (0) | 2022.02.27 |
[ Flutter ] ํ๋ซํผ ๋์ (0) | 2022.02.24 |
[ Flutter ] ์ด๋ฏธ์ง (0) | 2022.02.22 |