커스텀 위젯
커스텀 위젯 만드는 법
stless 하고 tab 키 누르면 만들어짐.
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp()); // 앱 시작해주세요 라는 뜻임
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super (key:key);
@override
Widget build(BuildContext context){
return MaterialApp(
home:Scaffold(
appBar: AppBar(),
body: ShopItem() // 커스텀 위젯 사용부분
)
);
}
}
// 여기가 커스텀 위젯
class ShopItem extends StatelessWidget { // 커스텀 위젯은 class로 만든다.
// 커스텀 위젯 되려면 class 안에 변수 많이 넣어야 함.
const ShopItem({Key? key}) : super(key: key); // 몰라도 됨.
@override // 클래스 만들 때 extends 옆에 애를 복사하는 것임.
// StatelessWidget 안에 build 가 있을 수 있으니까 중복되어도 상관 없게 해주세요 하는 것임
Widget build(BuildContext context) { // 함수 임. 괄호 안에는 (파라미터고)
return SizedBox(
child: Text('안녕'),
);
}
}
주석 안에 설명 참조..
쉬운 방법으로 긴 레이아웃 축약 가능
변수에 담는 방법임.
var a = SizedBox(
child: Text('안녕'),
);
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super (key:key);
@override
Widget build(BuildContext context){
return MaterialApp(
home:Scaffold(
appBar: AppBar(),
body: a
)
);
}
}
변수에 담으면 그대로 대치된다고 생각하면 됨.
아무거나 다 커스텀 위젯으로 만들면 좋겠네요?? 아님 그러면 너무 복잡함
- 재사용 많은 UI
- 큰 페이지로 만듬.
ListView
우리가 앱에 보여줄 항목이 100개라면?
이거 100개 만들거야?? 그러면 스크롤바가 안생김
그럴 땐 ListView 안에 담아라!
```dart
body: ListView(
children: [
Text('안녕'),
Text('안녕'),
Text('안녕'),
Text('안녕'),
Text('안녕'),
Text('안녕'),
]
)
ListView에 담으면
- 스크롤바가 생김.
- 스크롤 위치 감시도 가능함.
- 메모리 절약 기능도 있음.
쇼핑몰, 인스타그램 피드 들… 다 리스트뷰라고 보면 된다.. 근데 왜 난 스크롤바가 안뜨지??
숙제 답
var bottomAppBar = BottomAppBar(
child: Container(
height: 70,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, // 적절히 떨어뜨림.
children:[
Icon(Icons.phone),
Icon(Icons.message),
Icon(Icons.contact_page)
]
),
)
);
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super (key:key);
@override
Widget build(BuildContext context){
return MaterialApp(
home:Scaffold(
appBar: AppBar(),
body: ListView(
children: [
ListTile( // ListTile 이라는 애를 써봤음.
leading: Image.asset('wild-dog.jpg'),
title:Text('홍길동')
),
]
),
bottomNavigationBar: bottomAppBar
)
);
}
}
문제점.
ListTile 100개 어떻게 만들거야? 반복문.. 사용!
자동으로 반복해주는 ListView.builder
body: ListView.builder(
itemCount: 3, // 몇번 반복?
itemBuilder: (context, index){ //
return Text('who');
}),
body: ListView.builder(
itemCount: 100,
itemBuilder: (context, index){
return ListTile(
leading: Image.asset('wild-dog.jpg'),
title:Text(index.toString())
);
}),
print() 안에 넣어주면 디버깅 가능함.
여기까지가 레이아웃