반응형
인스타그램에서는 친구의 접속 여부를 확인할 수 있는데, Firebase를 이용하면 Flutter에서도 이를 구현할 수 있다. 해당 기능은 아래 블로그 글을 참고하여 구현했다.
플러터(Flutter) - 앱 상태(AppLifeCycle) 이벤트 얻기
플러터(Flutter)로 개발하다 보면 안드로이드(Android)의 앱 상태(LifeCycle) 이벤트(onResume, onPa...
blog.naver.com
사용자 상태 변환 관리
아래 코드는 앱에 접속해 있을 때 계속 실행되는 컨트롤러에 넣으면 된다.
`WidgetsBindingObserver`를 `with` 키워드를 사용해 추가해주면 화면 생명 주기 관련 기능을 사용할 수 있다.
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();
}
반응형
'Flutter' 카테고리의 다른 글
[Flutter] 네이버 로그인 (0) | 2024.10.03 |
---|---|
[Flutter Error] invalid android_key_hash or ios_bundle_id or web_site_url 에러 (0) | 2024.09.29 |
[Flutter] 카카오 로그인 (0) | 2024.09.29 |
[Flutter] Stack 잘리는 경우 (0) | 2024.09.04 |
[Flutter] GestureDetector 전체 행 클릭 (0) | 2024.08.15 |