본문으로 바로가기

stful 위젯의 lifecycle

category 📱 Mobile/📱 (old) Flutter v 1.0 2020. 5. 21. 14:36

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();
  }
}

darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체