ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Flutter: 날씨앱 만들기 (앱의 생명주기)
    공부 기록/Flutter 2022. 1. 6. 00:11
    728x90

    강의 정리

    Statless widget은 한번 생성되면 상태를 변경할 수 없기 때문에, 상태를 변경하려면 build method를 통해 stateless widget을 destroy후 rebuild해야함.

     

    반면 Stateful widget은 Stateful object와 결합되어 있음. Stateful object은위젯의 구성요소나 위젯의 속성을 추적하는 역할을함. setState method를 통해 Stateful object은 위젯의 구성요소나 위젯의 속성의 변수를 언제든지 업데이트할 수 있음.

    Stateful widget의 생명주기를 살펴보면,

    - initState method:  state가 최초로 생성될 때 호출되는 메서드
    - build method: 눈으로 보게되는 위젯을 빌드하는 메서드
    - dispose method: Stateful widget이 파괴될때 호출되는 메서드 (deactivate method도 비슷한 역할을 함)

     

    Stateful widget에서 다음 메서드들을 호출해보자:

    initState(): stateful widget이 생성하면 이 위젯이 위젯트리에 삽입되자마자 이 initState method가 호출됨. stateful widget이 생성되자마자 어떤 기능을 제공하고싶으면, initState() 안에서 호출하거나 필요한 메서드를 호출하면됨.

    dispose(): 위젯이 위젯트리에서 영원히 삭제될 때 호출됨

     

    오른쪽에 installing devtools가 보이면, 아래와 같이 조치하기

    ScreenB.dart에 추가한 예제를 통해 주기를 확인해보자. ScreeA 화면에서 Go to ScreenB를 누르면

    stateful 위젯이 생성되며 initState가 호출되고 build가 호출되며 build()안에 있는 다음 화면이 나타남.  

    build() 안에 다음 구조를 가진 Scaffold를 반환하도록 작성했기 때문에, Flutter inspector에도 ScreenB가 추가됨을 확인할 수 있음.

    위의 화면에서 버튼을 누르면 Navigator.pop이 실행되며, ScreenB가 파괴되며, 이 때 dispose()가 호출도면서 'dispose is called' 메시지가 호출됨.   이 때 Flutter inspector에도 ScreenB가 사라짐

     


    API: 일련의 표준화된 명령어나 기능, appBar, textStyle 등 특정 기능들을 직접 개발하지 않아도 이미 개발된 기능들을 사용할 수 있도록. 
    매개 역할자로써의 API. 은행 창구 직원과 같은. 돈을 요청하면 비밀번호를 확인하듯, API를 호출하면 키 값(인증키)을 요구해서 확인 후에 일치하면 요구한 것을 전달해주는..  API는  어떤 데이터를 얼마만큼 요구(쿼터)할 수 는지, 무엇을 할 수 있을지(권한)에 대한 제한사항이 있음. 앱(클라이언트)과 서버가 어떻게 상호작용해야할지에 대한 규약이 정해져있음. 요청이 유효할 경우에만 데이터를 전달함. 유효하지 않는 데이터를 요청하면 404 에러 발생

     

    https://pub.dev/packages/geolocator

    날씨API 사용을 위해 geolocator 플러터 pkg 설치하고, read me를 참고하여 설정

    1. dart 파일에 API문서에서 가져온 코드를 복사하여 메서드를 추가해줌. await을 위해서 async 추가

    2. 위치 권한 추가를 위해 다음 추가 (Android, ios 각각 다음 추가. 이미지와 read.me 문서 참고)

    skf

    dependency, manifest 파일 수정하였으므로 앱을 restart해야함.  

    그럼에도 getLocation이 작동하지 않아, 문서를 보고 권한을 묻는 메서드를 추가하였다.

    권한을 허용하니 이제야 위치가 console에 찍힌다. 와 신기하다. 나중에 내비게이션이나 길찾기 API 사용할 때 현재 좌표를 알아낼 때 사용하면 좋겠다. 

    애뮬레이터의 시간과 위치를 설정하지 않으면 애플 본사의 위치 정보가 전달된다.

    import 'package:flutter/material.dart';
    import 'package:geolocator/geolocator.dart';
    
    class Loading extends StatefulWidget {
      const Loading({Key? key}) : super(key: key);
    
      @override
      _LoadingState createState() => _LoadingState();
    }
    
    class _LoadingState extends State<Loading> {
    
      void getLocation() async{ // 현재 위치 가져오기
        Position position = await Geolocator.getCurrentPosition(
            desiredAccuracy: LocationAccuracy.high);
        print(position);
      }
      void requestPermission() async { //권한 요청하기
        LocationPermission permission = await Geolocator.requestPermission();
      }
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: ElevatedButton(
              onPressed: (){
                requestPermission();
                getLocation();
              },
              child: Text('Get my location'),
            ),
          ),
        );
      }
    }

    댓글

Designed by Tistory.