콘텐츠로 이동

다시 가져오기와 오프라인

앱이 포그라운드로 돌아오거나 네트워크가 다시 연결되면 Fuery가 stale 데이터를 다시 가져와요. 그래서 당겨서 새로고침하지 않아도 화면이 바뀐 데이터를 보여줘요. Fuery 위젯, 훅, FueryProvider가 앱 생명주기를 대신 연결해요. 네트워크 연결 상태를 반영하려면 onlineManager.setEventListener로 연결 상태 소스를 연결하세요.

Fuery는 AppLifecycleState 값을 포커스 상태로 바꿔요.

앱 상태 Fuery가 보는 상태
resumed 포커스 있음
hidden, paused, detached 포커스 없음
inactive 이전 상태 유지. 시스템 다이얼로그처럼 잠깐 끼어드는 일은 포커스 변화로 치지 않아요.
  • 앱이 다시 포커스를 얻으면, Fuery는 마운트된 위젯이 보여주는 쿼리처럼 사용 중인 쿼리 가운데 stale 상태인 쿼리를 모두 다시 가져와요.
  • 앱에 포커스가 없는 동안에는 Fuery가 재시도를 미뤄요.
  • 쿼리에 refetchIntervalInBackground를 설정하지 않았다면 백그라운드에서는 폴링도 멈춰요.
  • refetchOnFocus는 앱이 다시 포커스를 얻을 때 쿼리마다 다시 가져올지 정해요. 값은 RefetchMode.ifStale(기본값), RefetchMode.always, RefetchMode.never예요.

포커스 상태는 FueryFocusManager인 focusManager가 담고 있어요. focusManager는 키보드 포커스가 아니라 앱이 포그라운드에 있는지를 추적해요.

멤버 하는 일
setFocused(false) 앱이 백그라운드에 있다고 알려요. 테스트에서 앱이 백그라운드로 가는 상황을 흉내 낼 때 사용해요.
setFocused(null) 직접 설정한 상태를 버려요. 이벤트 소스가 바뀐 상태를 알릴 때까지 앱은 포커스가 있는 것으로 봐요.
isFocused Fuery가 앱에 포커스가 있다고 보는지 나타내요. 다른 상태를 알리기 전까지는 true예요.
setEventListener(setup) 포커스 소스를 바꿔요. Flutter에서는 먼저 FueryBinding.ensureInitialized()를 호출하세요. 그러지 않으면 처음 만들어지는 Fuery 위젯, 훅, FueryProvider가 직접 연결한 소스를 앱 생명주기로 바꿔요. Flutter 밖에서는 호스트가 제공하는 이벤트를 연결하세요. setup은 콜백을 받아요. 콜백에 true나 false를 넘기거나, 리스너에게 다시 알리려면 값 없이 호출하세요. setup은 정리 함수나 null을 반환해요.

FueryProvider 없이 Bloc에서만 쿼리를 사용하는 앱에는 생명주기를 연결하는 것이 없어요. 앱을 시작할 때 이 코드를 한 번 호출하세요.

void main() {
WidgetsFlutterBinding.ensureInitialized();
FueryBinding.ensureInitialized();
runApp(const App());
}

Fuery는 소스가 다르게 알리기 전까지 기기가 온라인이라고 봐요. 오프라인일 때 가져오기를 멈추고 네트워크가 다시 연결되면 다시 가져오려면, connectivity_plus 같은 연결 상태 소스를 연결하세요.

onlineManager.setEventListener((setOnline) {
final subscription = Connectivity().onConnectivityChanged.listen((results) {
setOnline(!results.contains(ConnectivityResult.none));
});
return subscription.cancel;
});

기기가 오프라인인 동안에는 이렇게 동작해요.

  • 가져와야 하는 쿼리는 FetchStatus.paused를 알리고, 기존 데이터를 계속 보여줘요.
  • 오프라인에서 시작한 뮤테이션은 기다렸다가 네트워크가 다시 연결되면 실행돼요.

네트워크가 다시 연결되면 Fuery는 멈춘 뮤테이션을 먼저 이어서 실행해요. 쿼리는 뮤테이션이 끝난 뒤에 다시 가져와요. 그래서 다시 가져온 데이터가 낙관적 업데이트를 덮어쓸 수 없어요. 첫 데이터를 아직 불러오는 쿼리는 기다리지 않고 바로 이어서 가져와요. 앱이 포그라운드로 돌아올 때도 Fuery는 같은 순서로 동작해요.

네트워크 연결 상태는 onlineManager가 담고 있어요.

멤버 하는 일
setEventListener(setup) 연결 상태 소스를 연결해요. setup은 setOnline을 받고, 정리 함수나 null을 반환해요. 새 소스는 이전 소스를 대신해요.
setOnline(online) 연결 상태를 직접 알려요. 디버그용 스위치나 테스트에서 사용해요.
isOnline Fuery가 기기를 온라인으로 보는지 나타내요. 소스가 다르게 알리기 전까지는 true예요.

networkMode는 쿼리나 뮤테이션이 연결 상태에 어떻게 반응할지 정해요.

모드 동작
NetworkMode.online 기본값. 온라인일 때만 가져오고 재시도해요.
NetworkMode.always 연결 상태를 무시해요. 로컬 데이터베이스 같은 곳에 사용해요. 이 모드의 쿼리는 refetchOnReconnect를 설정했을 때만 네트워크가 다시 연결되면 다시 가져와요.
NetworkMode.offlineFirst 첫 시도는 연결 상태와 상관없이 실행하고, 오프라인이면 재시도를 멈춰요. 오프라인에서도 캐시 계층이 응답할 수 있는 요청에 알맞아요.

오프라인에서 멈춘 뮤테이션 이어서 실행하기

섹션 제목: “오프라인에서 멈춘 뮤테이션 이어서 실행하기”

오프라인에서 멈춘 뮤테이션은 앱이 다시 포커스를 얻거나 네트워크가 다시 연결되면 Fuery가 이어서 실행해요. 다른 시점에 이어서 실행하려면 resumePausedMutations를 호출하세요.

await client.resumePausedMutations();
  • 클라이언트에서 멈춘 뮤테이션을 모두 이어서 실행해요.
  • 기기가 오프라인이면 아무것도 하지 않아요.
  • 멈춘 뮤테이션은 persist가 없으면 앱을 다시 시작할 때 사라져요. 뮤테이션 저장하기를 참고하세요.

홈 셸의 와이파이 버튼이 연결 상태 소스를 대신해요. 이 버튼은 onlineManager.setOnline으로 연결 상태를 알려요. 게시물 화면에서 오프라인일 때 쓴 댓글은 멈췄다가, 앱이 다시 온라인이 되면 전송돼요.