React에서 컴포넌트가 생명주기가 있듯이 flutter의 위젯에도 생명주기가 있다.
stless의 경우에는 라이프사이클이라고 볼 것이 없다. 상태에 즉각적으로 반응하지 않으며, 처음 한 번 빌드됩니다. 따라서 아무 문제가 없습니다.
반면 stful의 경우에는 state의 변화를 감지하고, 이에 따라 라이프사이클을 이용할 여지도 많다. (특정 페이지에 접속하자마자 위치 정보를 받아오는 등의 작업을 생성 초기에 배정하는 등...)
또한, stful은 히스토리를 이동해서 보이지 않게 되더라도 무조건 build되기 때문에 네트워크 통신 등 복잡한 로직을 build 메서드 내에서 처리하게되면 매번 해당 동작을 반복하게 됩니다. 화면을 이동할 때마다 모든 네트워크 통신이 이루어진다고 생각한다면....
따라서 이런 작업의 경우 lifecycle의 initState 메서드에서 처리해주는 것이 좋습니다.
라이프 사이클은 간단하게 3가지로 볼 수 있다.
// 처음 (화면에 보여지기 위한 빌드 이전)
@override
void initState() {
super.initState();
// Do Something
}
// 빌드 (화면에 보여질 때)
@override
build() {
// super로 가져올 게 없습니다. 그냥 build하시면 됩니다.
}
// 삭제, 다른 페이지 이동
@override
void deactivate() {
super.initState();
// Do Something
}
간단하게, 접속하면 위치 정보를 콘솔 창에 출력하도록 initState를 이용해보았다.
주의할 점은, 기존에 이미 정의된 것이기 때문에
(1) @override를 해줘야 한다는 것,
(2) 기존의 내용을 super를 통해 이어받아야 한다는 것이다. (완전히 새로 정의하고 싶다면 이야기가 다르다)
import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
class LoadingScreen extends StatefulWidget {
@override
_LoadingScreenState createState() => _LoadingScreenState();
}
class _LoadingScreenState extends State<LoadingScreen> {
Future<void> getLocation() async {
Position position = await Geolocator()
.getCurrentPosition(desiredAccuracy: LocationAccuracy.low);
print(position);
}
@override
void initState() {
super.initState();
getLocation();
}
@override
Widget build(BuildContext context) {
return Scaffold();
}
}
'📱 Mobile > 📱 (old) Flutter v 1.0' 카테고리의 다른 글
TextField를 통해 입력받은 값을 다른 페이지에 전달하기 (0) | 2020.05.22 |
---|---|
API 통신을 위한 http 패키지 및 json 활용 + Loader(spinner) (0) | 2020.05.22 |
빠른 코딩을 위한 상수 전용 페이지 구성과 .copywith 메서드 (0) | 2020.05.20 |
커스텀 위젯 만들기 (0) | 2020.05.19 |
변수 Final (runtime) vs Const (compile-time constants) (0) | 2020.05.18 |