작성
·
161
0
RestaurantPagination-5 2:25경에 나오는 부분입니다.
if (fetchMore) {
final pState = state as CursorPagination<T>;
state = CursorPaginationFetchingMore(
meta: pState.meta,
data: pState.data,
);
paginationParams = paginationParams.copyWith(
after: pState.data.last.id,
);
}
// 데이터를 처음부터 가져오는 상황.
else {
// 만약에 데이터가 있는 상황이라면
// 기존 데이터를 보존한 채로 Fetch를 진행한다.
// 여기!!
if (state is CursorPagination && !forceRefetch) {
final pState = state as CursorPagination<T>;
state = CursorPaginationRefetching<T>(
meta: pState.meta,
data: pState.data,
);
} else {
state = CursorPaginationLoading();
}
}
해당로직에서 "// 여기!!"로 표시한 부분에서
if(state is CursorPagination && !forceRefetch)조건문이 이해가지 않습니다.
fetchMore는 아닌데 새로고침(forceRefetch)도 아니다. 그런데 데이터를 이미 가지고 있고 새로운 데이터를 요청한다?
이게 어떤 경우를 의미하고 작성된 케이스일까요?
답변 2
0
안녕하세요!
"기존 데이터를 보존한 상태로 Fetch를 진행한다"라고 작성해뒀는데
forceRefetch의 경우 저는 캐시에서 데이터를 삭제하는편입니다.
기존 데이터를 삭제하지 않고 refresh를 진행하는 로직인 것 같네요.
refresh를 진행할때 리스트를 당겨서 윗쪽 RefreshIndicator만 돌아가게하고 리스트 데이터는 유지되도록 하는 상황과 리스트 전체를 로딩 인디케이터로 바꿔야하는 상황을 구분 할 수 있습니다.
하지만 언제까지나 "할 수 있다"이지 할 필요는 없습니다.
생각하시기에 불필요한 로직이라면 안넣으셔도 됩니다. 필요한 조건은 프로젝트별로 기획별로 다 다르니까요.
감사합니다!
안녕하세요!
아직 제가 밥을 안먹어서 머리가 안돌아가는걸수도 있는데 질문하신 부분과 관련있는 말씀이신지 모르겠습니다.
제 기억이 맞다면 리프레시는 두가지로 정의했습니다.
1) forceRefetch: true 강제 리프레시 -> data 캐시 날리면서 처음부터 초기화. 초기 요청처럼 중앙에 크게 로딩 표시를 해줄 수 있음 (해줘야 한다는건 아닙니다. 그냥 제가 그렇게 정의 했습니다)
2) fetchMore: false, forceRefetch: false -> data 캐시는 유지하면서 초기 데이터 가져오기 (요청은 1번과 같음. 데이터가 캐시에 존재하 존재하지 않냐의 차이). 이럴경우 RefreshIndicator 로딩만 보여주고 초기데이터가 도착하기 전까지 기존 캐시 데이터 유지 할 수 있음.
제가 구현한 방식
1) forceRefetch: true
2) fetchMore: false, forceRefetch: false
구현 하고싶으신 방식
1) forceRefetch: true
2) fetchMore: false, forceRefetch: true
a) 왜 조건을 forceRefetch: false인 경우로 했냐는게 질문이실까요? 단순 변수이기 때문에 forceRefetch: true인 경우로 하는게 맞다고 생각드시면 그렇게 하셔도 상관 없습니다. 하지만 그렇게 한다면 상위 조건들도 다 확인 해보셔야 할겁니다. 저는 전자를 가정하고 로직을 작성 했으니까요.
b) 아니면 왜 UI에서 사용하지 않는 조건의 로직을 작성했는지에 대한 질문일까요? 모든 가능한 조건에 대한 로직을 풀어나간거라 실제로 사용되지 않는 로직이 존재할 수 있습니다.
"새로고침의 경우 forceRefetch가 true일 테니까요"라고 하셨는데 2번 조건을 실행하고 싶다면 새로고침을 forceRefetch: false로 하면 되는데 왜 꼭 true여야하는지 잘 모르겠습니다.
감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다.
lcs님의 질문에 대해 적절하게 답변드릴 수 있는 부분을 찾았습니다. 질문하신 if(state is CursorPagination && !forceRefetch)
부분은 데이터를 이미 가지고 있으면서 새로운 데이터를 요체하는 상황에서, 기존 데이터를 보존하며 새로운 데이터 요청을 처리하는 로직의 일부입니다. 여기서 fetchMore가 아닌데 forceRefetch도 아니다
는 상태는 다음과 같은 상황을 의미합니다:
fetchMore
가 false
인 경우: 추가 데이터를 불러오는 ‘더보기’ 기능을 수행하지 않는 상태입니다.forceRefetch
가 false
인 경우: 사용자가 강제로 데이터를 새로고침(refresh)하고자 하는 의도가 없는 상태입니다.따라서, 이 조건문은 사용자가 명시적으로 새로고침을 요청하지 않았고, 추가 데이터를 요청하는 ‘더보기’를 진행하지도 않으면서, 기존에 불러온 데이터가 있다면 기존 데이터를 유지한 채 다른 작업을 수행하고자 할 때를 의미합니다. 이러한 상황에서는 기존의 데이터 상태를 보존하면서 새로운 데이터 요청을 처리하기 위해 CursorPaginationRefetching
상태를 설정합니다.
이와 관련하여 비슷한 상황에 대해 설명하는 내용이 있는 URL을 찾았습니다: CursorPaginationRefetching 상황은 구현인 안된건가요??
이 글에서는 CursorPaginationRefetching
이 데이터 상태를 보존하면서도 새로운 데이터를 요청할 수 있게 하는 메커니즘에 대해 설명하고 있습니다. 언급한 forceRefetch
및 데이터 상태에 관한 로직은 데이터를 유지하면서 사용자에게 보다 유연한 데이터 관리 및 제어 기능을 제공하기 위한 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
"사용자가 명시적으로 새로고침을 요청하지 않았고, 추가 데이터를 요청하는 ‘더보기’를 진행하지도 않으면서, 기존에 불러온 데이터가 있다면 기존 데이터를 유지한 채 다른 작업을 수행하고자 할 때를 의미합니다"
이런 경우가 언제인지를 모르겠습니다.
데이터를 들고있는데 fetchMore가아니고 새로운 데이터를 요청한다라면 "새로고침"밖에 없는 것 아닌가요?
음... 말씀하시는 것을 아래와 같이 이해했습니다.
"기존에 데이터가 존재하는 상태에서 리스트를 당겨서 새로고침하는 상황에 해당하는 로직이다.
이때, 기존 리스트 데이터가 유지되기 위해서 필요한 로직이다."
그렇다면
if (state is CursorPagination && !forceRefetch) 가 아니라
if (state is CursorPagination && forceRefetch)여야하는 것 아닌가요?
새로고침의 경우 forceRefetch가 true일 테니까요.