작성
·
124
0
선생님 안녕하세요. 완강 후 코드 뜯어보면서 복습 중입니다:)
주문 탭 클릭 시 곧바로 주문한 최신 리스트를 볼 수 있게하는 방법을 고민하다가 orderProvider를 들여다 보았는데요.
곰곰히 생각해보니 postOrder만 해서는 orderProvider(orderStateNotifier)의 상태가 업데이트가 안되는 거 아닌가 하는 생각이 들었습니다.
그래서 forceRefetch하는 것처럼, postOrder 함수 하단에 true 반환하기 전에 paginate()를 실행하여 주문 탭 클릭시 곧바로 최신 리스트 뜨도록 했습니다.
Future<bool> postOrder() async{
try{
final uuid = Uuid();
final id = uuid.v4();
final state = ref.read(basketProvider);
final resp = await repository.postOrder(
body: PostOrderBody(
id: id,
products: state.map((e) =>
PostOrderBodyProduct(productId: e.product.id, count: e.count)).toList(),
totalPrice: state.fold(0, (pre, next) =>
pre + (next.product.price * next.count)),
createdAt: DateTime.now().toString()));
paginate();
return true;
}
catch(e){
return false;
}
}
이렇게 하는 게 옳은 방법일까요? 그리고 굳이 forceRefetch를 통해서만 주문탭이 업데이트되게 하신 이유가 있을까요?
답변 1
0
안녕하세요!
말씀하신 것처럼 주문이 들어가고 바로 메모리에 업데이트를 하려한다면 orderProvider를 직접 갱신 해줘야합니다.
다만 paginate()를 다시 실행하는 것보다는 저희가 optimistic response를 다뤘을때 했던 것 처럼 메모리에 데이터를 직접 넣어주는게 조금 더 리소스 효율적입니다.
왜냐하면 paginate() 함수를 실행하게되면 다시 한 페이지에 해당되는 데이터를 가져오게 되지만 실제로 저희가 업데이트 해야하는 주문은 한개이기 때문입니다.
감사합니다!
아, 그러면 basketProvider에서 했던 것과 유사하게 addOrder 같은 함수를 만들어서 데이터를 메모리에 먼저 집어 넣어주고 마지막에 debouncer까지 적용해주면 될까요?