<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_tnals.log</title>
        <link>https://velog.io/</link>
        <description>처음 개발하는 사람들이 봐도 이해될 수 있게</description>
        <lastBuildDate>Sat, 25 Mar 2023 16:27:02 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. dev_tnals.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_tnals" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Flutter 에서 생명주기를 다뤄보자]]></title>
            <link>https://velog.io/@dev_tnals/Flutter-%EC%97%90%EC%84%9C-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0%EB%A5%BC-%EB%8B%A4%EB%A4%84%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@dev_tnals/Flutter-%EC%97%90%EC%84%9C-%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0%EB%A5%BC-%EB%8B%A4%EB%A4%84%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Sat, 25 Mar 2023 16:27:02 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_tnals/post/9b945aca-25cf-42af-81e3-f61ccf7d00fa/image.jpg" alt="">
토이 프로젝트인 간호사 캘린더를 만들고 있는데, SharedPreference 를 이용해 기기 내에서 그 달의 계획을 저장해두려고 한다.</p>
<p>원래는 그 날의 일정을 정할 때 (아래 4개 중 한 버튼을 눌러 일정을 정하거나 취소할 때 ) 마다 SharedPreference 에 정보를 갱신해주려고 했는데, 너무 비효율적이라는 생각이 들었다.</p>
<p>앱을 종료할 때 정보를 저장하면 훨씬 효율적이라는 생각이 들었고, flutter 의 생명 주기를 찾아보았다.</p>
<p><strong>Flutter는 Android와는 다르게 생명주기(Lifecycle) 개념을 직접 구현하지 않는다.</strong> </p>
<p>Flutter에서는 Android의 생명주기(Lifecycle) 개념과는 다르게, 앱의 상태 변화를 AppLifecycleState 라는 열거형 상수를 통해 확인할 수 있다. 이는 앱의 생명주기와 유사한 개념이지만, 엄밀히 말하면 생명주기(Lifecycle)는 Android와 같은 플랫폼에서만 존재하는 개념이라고 한다..</p>
<p>따라서, Flutter에서는 생명주기 메소드(onCreate, onStart, onResume 등)를 직접적으로 구현하지 않는다. 대신, AppLifecycleState 열거형 상수를 사용하여 앱의 상태 변화를 추적하고, <strong>didChangeAppLifecycleState 메소드를 오버라이드하여 상태 변화에 따라 필요한 작업을 수행한다.</strong></p>
<p>Flutter에서는 다음과 같은 네 가지의 AppLifecycleState가 제공된다.</p>
<ol>
<li>AppLifecycleState.inactive: 앱이 활성화되지 않은 상태이다. 예를 들어, 다른 앱이나 시스템 대화 상자와 같은 것이 표시되었을 겨우.</li>
<li>AppLifecycleState.paused: 앱이 일시 중지된 상태이다. 예를 들어, 앱이 백그라운드로 이동했을 경우.</li>
<li>AppLifecycleState.resumed: 앱이 활성화된 상태이다. 예를 들어, 사용자가 앱으로 돌아왔을 경우.</li>
<li>AppLifecycleState.detached: 앱이 분리된 상태이다. 예를 들어, 앱이 분할 화면 모드에서 다른 앱과 함께 실행 중인 경우.</li>
</ol>
<p>내 개발 요구사항을 생각해 봤을 때 활용할 수 있는 메소드는 2번이다. </p>
<pre><code>import &#39;package:flutter/material.dart&#39;;

class MyWidgetsBindingObserver extends WidgetsBindingObserver {
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.paused) {
      Get.find&lt;InitEventStart&gt;().setPreference();
    }
  }
}

void main() {
  runApp(MyApp());
  WidgetsBinding.instance.addObserver(MyWidgetsBindingObserver());
}


</code></pre><p>위 코드에서 MyWidgetsBindingObserver 클래스는 WidgetsBindingObserver를 상속받아 didChangeAppLifecycleState 메서드를 오버라이드한다. 이 메서드에서 AppLifecycleState가 paused 상태로 변경되는 시점에서 실행할 코드를 작성할 수 있다.</p>
<p>하지만, &quot;모두 닫기&quot; 버튼을 누를 때는 어떤 메서드도 호출되지 않기 때문에, 이 경우에도 위의 예제처럼 WidgetsBindingObserver를 사용하여 앱 종료 직전에 실행할 작업을 구현할 수 없다.</p>
<p>그래도 &quot;모두 닫기&quot; 버튼을 누르기 전, 앱을 나가야 하므로 반드시 AppLifecycleState.paused 상태가 될 것이라, 이걸 사용해도 문제없다는 생각이 들었다.</p>
]]></description>
        </item>
    </channel>
</rss>