inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

Restaurant Pagination - 5

PaginationProvider의 로직 중 이해안가는 부분이 있습니다.

231

lcs

작성한 질문수 2

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)도 아니다. 그런데 데이터를 이미 가지고 있고 새로운 데이터를 요청한다?
이게 어떤 경우를 의미하고 작성된 케이스일까요?

flutter 하이브리드-앱

답변 2

0

코드팩토리

안녕하세요!

"기존 데이터를 보존한 상태로 Fetch를 진행한다"라고 작성해뒀는데

forceRefetch의 경우 저는 캐시에서 데이터를 삭제하는편입니다.

기존 데이터를 삭제하지 않고 refresh를 진행하는 로직인 것 같네요.

refresh를 진행할때 리스트를 당겨서 윗쪽 RefreshIndicator만 돌아가게하고 리스트 데이터는 유지되도록 하는 상황과 리스트 전체를 로딩 인디케이터로 바꿔야하는 상황을 구분 할 수 있습니다.

하지만 언제까지나 "할 수 있다"이지 할 필요는 없습니다.

생각하시기에 불필요한 로직이라면 안넣으셔도 됩니다. 필요한 조건은 프로젝트별로 기획별로 다 다르니까요.

감사합니다!

0

lcs

음... 말씀하시는 것을 아래와 같이 이해했습니다.
"기존에 데이터가 존재하는 상태에서 리스트를 당겨서 새로고침하는 상황에 해당하는 로직이다.
이때, 기존 리스트 데이터가 유지되기 위해서 필요한 로직이다."

그렇다면
if (state is CursorPagination && !forceRefetch) 가 아니라
if (state is CursorPagination && forceRefetch)여야하는 것 아닌가요?

새로고침의 경우 forceRefetch가 true일 테니까요.

0

코드팩토리

안녕하세요!

아직 제가 밥을 안먹어서 머리가 안돌아가는걸수도 있는데 질문하신 부분과 관련있는 말씀이신지 모르겠습니다.

제 기억이 맞다면 리프레시는 두가지로 정의했습니다.

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

정 민욱

일반 새로고침과 forceRefetch에 대한 정의가 헷갈리면서 발생한 문제였네요
자세한 답변 감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.

lcs님의 질문에 대해 적절하게 답변드릴 수 있는 부분을 찾았습니다. 질문하신 if(state is CursorPagination && !forceRefetch) 부분은 데이터를 이미 가지고 있으면서 새로운 데이터를 요체하는 상황에서, 기존 데이터를 보존하며 새로운 데이터 요청을 처리하는 로직의 일부입니다. 여기서 fetchMore가 아닌데 forceRefetch도 아니다는 상태는 다음과 같은 상황을 의미합니다:

  • fetchMorefalse인 경우: 추가 데이터를 불러오는 ‘더보기’ 기능을 수행하지 않는 상태입니다.
  • forceRefetchfalse인 경우: 사용자가 강제로 데이터를 새로고침(refresh)하고자 하는 의도가 없는 상태입니다.

따라서, 이 조건문은 사용자가 명시적으로 새로고침을 요청하지 않았고, 추가 데이터를 요청하는 ‘더보기’를 진행하지도 않으면서, 기존에 불러온 데이터가 있다면 기존 데이터를 유지한 채 다른 작업을 수행하고자 할 때를 의미합니다. 이러한 상황에서는 기존의 데이터 상태를 보존하면서 새로운 데이터 요청을 처리하기 위해 CursorPaginationRefetching 상태를 설정합니다.

이와 관련하여 비슷한 상황에 대해 설명하는 내용이 있는 URL을 찾았습니다: CursorPaginationRefetching 상황은 구현인 안된건가요??

이 글에서는 CursorPaginationRefetching이 데이터 상태를 보존하면서도 새로운 데이터를 요청할 수 있게 하는 메커니즘에 대해 설명하고 있습니다. 언급한 forceRefetch 및 데이터 상태에 관한 로직은 데이터를 유지하면서 사용자에게 보다 유연한 데이터 관리 및 제어 기능을 제공하기 위한 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

lcs

"사용자가 명시적으로 새로고침을 요청하지 않았고, 추가 데이터를 요청하는 ‘더보기’를 진행하지도 않으면서, 기존에 불러온 데이터가 있다면 기존 데이터를 유지한 채 다른 작업을 수행하고자 할 때를 의미합니다"

이런 경우가 언제인지를 모르겠습니다.
데이터를 들고있는데 fetchMore가아니고 새로운 데이터를 요청한다라면 "새로고침"밖에 없는 것 아닌가요?

Isar 마지막 업데이트는 2년전입니다.

0

30

0

FlutterSecureStorage 질문

0

31

0

Dio onError Interceptor 만드는 부분에 질문이 있습니다.

0

79

2

관리자 기능에 대한 질문

0

100

2

part 'restaurant_model.g.dart';

0

92

1

36강. dio 인터셉터에 storage를 전달하는 코드가 이해 안되는데요. 도움 부탁드립니다.

0

56

2

2번 반환 상황 관련 질문

0

61

2

riverpod 3.0

0

139

2

Asset folder??

0

82

2

디자이너와 협업 시 프레임 크기 설정 관련 질문

0

113

2

FutureProvider, StateNotifierProvider 선택 기준

0

70

2

컴포넌트 모델화

0

64

2

쿼리 파라미터

0

84

2

화면 안보임

0

68

2

PaginationListView

0

54

1

강의중 37.Dio onErrorInterceptor 작업하기 dio 관련 질문입니다.

0

101

2

프로토타입이미지

0

62

2

여러 객체를 상태 관리하는 방법에 대한 질문

0

84

2

장바구니 결제하기 응답이 500이 옵니다.

0

105

2

removeFromBasket에서 await patchBasket()을 마지막에 하면 에러나는거 아닌가요?

0

67

2

이 두가지는 완전히 동일한 기능인가요?

0

106

3

내부 코드를 작성하지 않은 CursorPaginationLoading가 어떻게 로딩상태를 갖는지 잘 모르겠습니다...

0

77

2

_SplashScreenState에서 storage를 late로 호출해서 한번만 불러와도 되나요?

0

86

2

코딩 작성 순서 관련 질문

0

88

2