2017-11-12 4 views
2

Dart/Flutter를 처음 사용하여 LinearProgressBar가 매초마다 업데이트되는 간단한 앱을 제작하고 싶습니다.Flutter App에서 onPause/onResume을 처리하는 방법은 무엇입니까?

실제 코드를 너무 많이 사용하지 않으면 다음 설정이 작동합니다.

  • 전달 된 시간을 기준으로 진행 상황을 계산하는 함수입니다.
  • 진행 상황을 보여주는 LinearProgressBar입니다.
  • 진행률을 다시 계산하고 매 초마다 진행률 막대를 업데이트하는주기적인 타이머입니다.
  • 매번 디버그 '틱'을하면 재 계산이 완료됩니다.

모든 것이 한 가지 예외로 예상대로 작동합니다. 안드로이드 장치의 백그라운드에서 앱을 움직이면 '틱'이 계속 인쇄됩니다.

기본 Android의 경우 'onPause'이벤트가 발생하면 주기적 타이머가 취소됩니다.

Flutter에는 비슷한 것이 있습니까? 내가 찾을 수있는 것은 'initState'와 '처분'뿐이었습니다. 그러나 Dispose는 앱을 배경으로 이동할 때 호출되지 않습니다.

타이머가 백그라운드에서 똑딱 거리지 않게하고 싶습니다.

제 연구에서이 스택 오버플로 질문 onresume-and-onpause-for-widgets-on-flutter을 발견했습니다. 대답은 TickerProviderStateMixin을 사용하는 것이 좋습니다.

다음과 같이 사용했습니다.

class _BarItemState extends State<BarItem> with SingleTickerProviderStateMixin { 
    Ticker ticker; 
    num progress = 1.0; 

    @override 
    void initState() { 
     super.initState(); 
     ticker = createTicker((duration) => setState(() { 
      debugPrint('tick'); 
      progress = duration.inSeconds/30; 
     })) 
     ..start(); 
    } 

    // other stuff omitted 

} 

효과가 있지만 여전히 만족스럽지 않습니다.

이유는 티커 콜백이 이제는 1 초에 1 초가 아닌 몇 밀리 초마다 호출되기 때문입니다. 이것은 마치 자원 낭비처럼 보입니다 (나는 부드러운 애니메이션이 필요하지 않습니다), ... 나는 것들을 과도하게 복제하고 있습니까? 내가 내 사용하는 경우에 필요하지 않은 것으로 보인다하더라도

, 나는 아직도 알고 싶다 :

어떻게 내 자신의 onPause/onResume 이벤트를 처리하는 방법?

답변

3

당신은 응용 프로그램 수명주기 변경에 대한 알림을받을 수 WidgetBindingObserver 인터페이스의 didChangeAppLifecycleState을 대체 할 수 있습니다.

샘플 코드가있어이 this page

0

lifecycle 채널은 SystemChannels에서 사용할 수 있습니다.

예 :

SystemChannels.lifecycle.setMessageHandler((msg){ 
    debugPrint('SystemChannels> $msg'); 
}); 

출력 :

I/flutter (3672): SystemChannels> AppLifecycleState.paused 
I/flutter (3672): SystemChannels> AppLifecycleState.resumed 
+0

에 나는 amirs 솔루션은 더 숙어는 것을 느꼈다. 답변을 주셔서 감사합니다! – forgemo

관련 문제