반응형

인스타그램에서는 친구의 접속 여부를 확인할 수 있는데, Firebase를 이용하면 Flutter에서도 이를 구현할 수 있다. 해당 기능은 아래 블로그 글을 참고하여 구현했다.

 

 

플러터(Flutter) - 앱 상태(AppLifeCycle) 이벤트 얻기

플러터(Flutter)로 개발하다 보면 안드로이드(Android)의 앱 상태(LifeCycle) 이벤트(onResume, onPa...

blog.naver.com

 

 

사용자 상태 변환 관리

아래 코드는 앱에 접속해 있을 때 계속 실행되는 컨트롤러에 넣으면 된다.

 

 

WidgetsBindingObserverwith 키워드를 사용해 추가해주면 화면 생명 주기 관련 기능을 사용할 수 있다.

class MyController extends GetxController with WidgetsBindingObserver

 

 

var userCollection =
      FirebaseFirestore.instance.collection('USER').doc("현재 접속중인 유저의 docId");

void _setUserStatus(bool isOnline) async {
  await userCollection.update({'isOnline': isOnline});
}
  • 사용자의 온라인 상태를 업데이트하는 함수

 

@override
void onInit() async {
  WidgetsBinding.instance.addObserver(this);
  _setUserStatus(true);
  super.onInit();
}
  • 컨트롤러가 초기화될 때 호출되는 함수
  • WidgetsBinding.instance.addObserver(this);
    • 현재 객체(this)를 앱의 생명 주기 관찰자로 추가한다. 이로 인해 didChangeAppLifecycleState 메서드가 호출될 수 있게 한다.
  • _setUserStatus(true);
    • 사용자가 온라인 상태임을 나타내도록 true를 인자로 넘긴다.

 

@override
void onClose() {
  WidgetsBinding.instance.removeObserver(this);
  _setUserStatus(false);
  super.onClose();
}
  • 컨트롤러가 종료될 때 호출된다.
  • WidgetsBinding.instance.removeObserver(this);
    • 앱의 생명 주기 관찰자로 등록된 현재 객체를 제거한다. 이렇게 하면 더 이상 앱 생명 주기에 대한 상태 변화를 듣지 않게 된다.
  • _setUserStatus(false);
    • 사용자가 오프라인 상태임을 나타내도록 false를 인자로 넘긴다.

 

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  if (state == AppLifecycleState.resumed) {
    _setUserStatus(true);
  }

  if (state == AppLifecycleState.inactive) {
    _setUserStatus(false);
  }
}
  • 앱의 생명 주기 상태 변화가 있을 때 호출된다. 예를 들어, 앱이 백그라운드에서 활성화되거나 비활성화될 때 호출된다.
  • AppLifecycleState.resumed
    • 앱이 다시 활성화되어 사용자가 앱을 사용하고 있을 때 호출된다. 이때 사용자의 상태를 온라인으로 설정한다.
  • AppLifecycleState.inactive
    • 앱이 비활성화되었을 때, 호출된다. 예를 들어, 다른 앱이 위로 올라오거나 홈 화면으로 나갔을 때 발생한다. 이때 사용자의 상태를 오프라인으로 설정한다.

사용자 상태 확인

화면에서 유저의 isOnline의 값에 따라 다르게 표시되도록 설정한다.

 

나는 친구 페이지에 Timer 객체를 선언한 후, 1분 간격으로 데이터를 가져오도록 설정했다.

Timer? _timer;

@override
void onInit() {
  super.onInit();
  _timer = Timer.periodic(const Duration(minutes: 1), (timer) {
    bringFriend();
  });
}

@override
void onClose() {
  _timer?.cancel();
  super.onClose();
}

 

 

 

 

 

반응형