목 차
1. 위젯이란??
2. 화면구성을 위한 위젯들
3. 상태관리.
4. 비동기 프로그래밍
5. 패키지 관리.
플러터에서 가장 중요한 개념은 "위젯"이라는 개념입니다.
Flutter프레임워크에서는 모든 것이 '위젯'으로 조합하여 만들어진 화면으로 구성됩니다.
플러터의 화면 구조는 여러 위젯들이 트리-형태로 구성되어있습니다.
가장 상위 위젯으로는
'상태'를 가지는 'StatefulWidget'과 상태를 가지지 않는 'StatelessWidget'의 두가지 종류가 있습니다.
'StatelessWidget' : 말 그대로 변화가 없는 위젯,
그러므로 초기값을 지정하기만 하면 만들어지는 화면을 말합니다.
'StatefulWiget' : 계속 상태가 변화함을 의미합니다.
이 말은 화면에 표시되는 내용도 변경된다는 것과 같습니다.
각 위젯의 Life cycle는 다음과 같습니다.
setState는 상태변경을 트리거하고,
이에 따라서 FLutter 프레임워크가 '위젯'을 다시 빌드하도록 요청하는데 사용됩니다.
StaefulWidget'에서만 사용가능하며,
setState를 호출하면 위젯의 build메서드가 다시 호출되어 UI를 업데이트 합니다.
☆ Flutter의 setState와 React에서 사용하는 useState 비교해보기.
class _ExampleState extends State<Example> {
int count = 0;
void increment() {
setState(() {
count++;
});
}
}
function Counter() {
const [count, setCount] = useState(0);
const increment = () => {
setCount(count + 1);
};
}
didUpdateWidet'은 부모 위젯이 변경될 때 호출되는 메서드입니다.
StaefulWidget'의 부모가 새로운 구성을 전달하면 ( ex: 부모 위젯이 다시 빌드되면 )
didUpdateWidget이 호출됩니다.
이 메서드는 주로 부모 위젯에서 전달받은 새로운 구성을 처리하거나,
상태를 적절하게 업데이트하는 데 사용됩니다.
화면을 구성하는 구성요소, 즉 UI를 종류별로 나누어보면 아래와 같습니다.
:: 유저동작을 받아 처리할 수 있는 위젯입니다.
TextField(
decoration: InputDecoration(
labelText: 'Input',
border: OutlineInputBorder(),
),
onChanged: (value) {
print(value);
},
)
Date & Time Pickers : 날짜(시간)피커는 다이얼로그를 사용하여, 단일날짜를 선택하는 위젯.
Future<void> _selectDate(BuildContext context) async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2024),
lastDate: DateTime(2025),
);
}
Future<void> _selectTime(BuildContext context) async {
final TimeOfDay? picked = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
);
}
만들어져있는 UI 패키지를 가져와서 사용하는 방법.
커스텀 패키지
Flutter 앱은 위젯에 '상태관리'를 함으로써 화면을 갱신하거나 화면이동 등을 할 수 있습니다.
이러한 상태를 관리하기 위해서 여러가지 패키지가 있습니다.(Bloc,Getx, Provider 등등)
:: 'Future', 'async', 'await', 'Stream' 등의 키워드를 사용해서 비동기 프로그래밍을 할 수 있습니다.
보통 APi에서 취득한 데이터는 '비동기'로 실행되기 때문에 자주 사용하는 패턴입니다.
'Future'는 Dart의 비동기 작업을 위한 객체로,
결과가 준비될 때까지 대기한 다음 결과를 반환하거나 오류를 던집니다.
Future<String> fetchData() {
return Future.delayed(
const Duration(seconds: 4),
() => "Hello World"
);
}
void main() async {
print("작업 시작");
var result = await fetchData();
print("결과: $result");
}
try {
final result = await fetchData();
print(result);
} catch (e) {
print('에러 발생: $e');
}
Stream
await for (final value in streamData) {
print(value);
}
Flutter는pubspec.yaml파일을 통해서 패키지를 관리합니다.
앱 메타정보나FlutterSDK버전정보등 의존관계정보를 관리합니다.
전부 다 소개할수 없지만 기본적인것만 설명하자면