강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của anwjr412863
anwjr412863

câu hỏi đã được viết

[Nhà máy mã] [Trung cấp] Hoạt động rung chuyển! Các kỹ năng cần thiết để trở thành tiền vệ như quản lý trạng thái, quản lý bộ đệm, tạo mã, GoRouter và logic xác thực!

Phản ứng lạc quan

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

Viết

·

55

·

Đã chỉnh sửa

0

  Future<void> patchBasket() async {
    await repository.patchBasket(
      body: PatchBasketBody(
        basket: state
            .map((e) => PatchBasketBodyBasket(
                  productId: e.product.id,
                  count: e.count,
                ))
            .toList(),
      ),
    );
  }

  Future<void> removeFromBasket({
    // true면 count에 관계없이 삭제
    bool isDelete = false,  
    required ProductModel product,
  }) async {
    // 1) 장바구니에 상품이 존재할때
    //    1-1) 상품의 카운트가 1보다 크면 -1
    //    1-2) 상품의 카운트가 1이면 상품 제거
    // 2) 장바구니에 상품이 존재하지 않을때
    //    2-1) 즉시 함수 반환하고 아무것도 하지 않음
    final exists =
        state.firstWhereOrNull((e) => e.product.id == product.id) != null;

    print('exists: $exists');

    if (!exists) {
      return;
    }

    final existingProduct = state.firstWhere((e) => e.product.id == product.id);

    if (existingProduct.count == 1 || isDelete) {
      state = state.where((e) => e.product.id != product.id).toList();
    } else {
      state = state
          .map(
            (e) => e.product.id == product.id
                ? e.copyWith(
                    count: e.count - 1,
                  )
                : e,
          )
          .toList();
    }
    await patchBasket();
  }

 

장바구니에서 삭제할 때 상품이 1개 있고 1개의 상품 주문갯수가 1일 때 삭제를 하게되면 해당id를 뺀 값들이 리스트에 담기게 되는데 그럼 장바구니는 전부 비어지게 됩니다. 그래서 스크린에서는 "장바구니 비어있습니다"가 나오는 것 까진 됩니다.

이후 어쨋든 patchBasket은 실행되는데 이때 리스트가 비어 있으니 서버호출할 때 400 에러가 발생합니다.. 서버단에서 비어있는 장바구니를 보내면 정상응답으로 비어 있는 get요청을 받는 과정이 필요한게 아닌가 해서 여쭤봅니다!

image.png


포스트맨에서도 빈 리스트를 보내면 400이 옵니다.

좋은 주말 되세요!

flutter하이브리드-앱

Câu trả lời 2

0

codefactory님의 프로필 이미지
codefactory
Người chia sẻ kiến thức

안녕하세요!

말씀하신 부분 반영해서 서버 다시 업로드 해드렸습니다.

원하신 기능이 맞는지 확인한번 부탁드립니다.

감사합니다!

0

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

장바구니에서 상품을 삭제할 때, 리스트가 비어서 서버에 빈 “basket”을 전송하는 경우 서버에서 400 에러가 발생하는 문제를 겪고 계신 것 같습니다. 이는 서버가 비어 있는 basket을 허용하지 않기 때문입니다.

이 문제를 해결하기 위해 몇 가지 접근 방법을 고려해 볼 수 있습니다:

  1. 빈 리스트 체크: patchBasket 메서드를 호출하기 전에 장바구니 리스트가 비었는지 확인해서 비어있다면 서버에 요청을 보내지 않도록 할 수 있습니다. 예를 들어, removeFromBasket 메소드 내에서 await patchBasket(); 전에 리스트가 비어 있는지 확인하는 코드를 추가하는 방법이 있습니다:

    if (state.isEmpty) {
      print('장바구니가 비어 있습니다. patchBasket을 요청하지 않습니다.');
      return;
    }
    await patchBasket();
    
  2. 서버에서 빈 리스트 처리: 만약 서버 코드를 수정할 수 있는 권한이 있다면 서버 로직에서 빈 리스트를 특별히 처리하여 에러를 발생시키지 않게 변경하는 방법도 있습니다.

질문해 주신 내용과 관련된 유사한 사례로는 ‘장바구니에 상품 추가하는 로직에서 궁금한 점이 있습니다‘라는 질문이 있습니다. 이 질문에서는 통신 효율성을 고려하여 patchBasket 호출 시점을 고민하고 논의한 바 있습니다. 참고하시면 도움이 될 것입니다.

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

Hình ảnh hồ sơ của anwjr412863
anwjr412863

câu hỏi đã được viết

Đặt câu hỏi