inflearn logo
강의

Khóa học

Chia sẻ kiến thức

[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!

Thiết lập máy chủ

basketProvider에서 patchBasket 함수 호출 시 에러가 발생합니다

326

Hyunsang-Coder

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

0

제 코드는 아래와 같고,

import 'package:advanced_app/product/model/product_model.dart';
import 'package:advanced_app/user/model/patch_basket_model.dart';
import 'package:advanced_app/user/model/basket_item_model.dart';
import 'package:advanced_app/user/repository/user_me_repository.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:collection/collection.dart';

final basketProvider = StateNotifierProvider<BasketProvider, List<BasketItemModel>>((ref) {
  final repository = ref.watch(userMeRepositoryProvider);
  return BasketProvider(repository: repository);
});

class BasketProvider extends StateNotifier<List<BasketItemModel>>{
  final UserMeRepository repository;

  BasketProvider({
    required this.repository,
}):super([]);

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

  }
  Future<void> addToBasket({
    required ProductModel product,}) async {
    // 1 아직 장바구니에 해당 상품이 없는 경우 -> 추가
    // 2 동일한 상품이 있는 경우 -> count +1

    final exists = state.firstWhereOrNull((e) => e.product.id == product.id) != null;

    if(exists){
      state = state
          .map(
              (e) => e.product.id == product.id
                  ? e.copyWith(count: e.count +1)
          : e
      ).toList();
    }else{
      state = [
        ...state,
        BasketItemModel(
            product: product,
            count:1)
      ];
    }

    await patchBasket();
  }

  Future<void> removeFromBasket({
  required ProductModel product,
    bool isDelete = false}) async{
    // isDelete면 count와 상관없이 삭제
    final exists = state.firstWhereOrNull((e) => e.product.id == product.id) != null;

    if(!exists){
      return;
    }
    // 이제 무조건 있는 경우
    final existingProduct = state.firstWhere((element) => element.product.id == product.id);
    
    // 1개 있는 경우 삭제 (해당하는 상품 빼고 리스트 만들어서 넣어 주는 방식)
    if (existingProduct.count == 1 || isDelete){
      state = state
          .where((e)
      => e.product.id != product.id)
          .toList();
    }
    else{
      // 2개 이상 있는 경우
      state = state
          .map((e) => e.product.id == product.id?
      e.copyWith(
          count: e.count -1) :
      e).toList();
    }
  }
}


에러 로그는 아래와 같습니다.
--------------
[VERBOSE-2:dart_vm_initializer.cc(41)] Unhandled Exception: type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast

#0 $BasketItemModelFromJson (package:advancedapp/user/model/basket_item_model.g.dart:11:54)

#1 new BasketItemModel.fromJson (package:advanced_app/user/model/basket_item_model.dart:25:14)

#2 UserMeRepository.patchBasket.<anonymous closure> (package:advancedapp/user/repository/user_me_repository.g.dart:93:45)

#3 MappedListIterable.elementAt (dart:_internal/iterable.dart:415:31)

#4 ListIterator.moveNext (dart:_internal/iterable.dart:344:26)

#5 new GrowableList.ofEfficientLengthIterable (dart:core-patch/growable_array.dart:189:27)

#6 new GrowableList.of (dart:core-patch/growablearray.dart:150:28)

#7 new List.of (dart:core-patch/array_patch.dart:47:28)

#8 ListIterable.toList (dart:_internal/iterable.dart:214:7)

#9 UserMeRepository.patchBasket (package:advancedapp/user/repository/user_me_repository.g.dart:94:10)



Postman에서 get http://127.0.0.1:3000/user/me/basket 실행해 보면,

[ { "count": 1 } ]

처럼 product가 제대로 안들어가고 count 값만 들어가 있습니다.

jsonSerializable 문제인가 싶어서 모델들 다 체크해봤는데... 코드 제너레이션도 정상적으로 되는데... 뭐가 문제일까요? 이것 때문에 3시간 넘게 씨름 중인데 도움 주시면 감사하겠습니다!

flutter 하이브리드-앱

Câu trả lời 3

0

codefactory

안녕하세요!

에러 메세지에서도 모델의 g파일을 가리키고 있습니다.

다음에 에러 메세지가 있을때는 꼭 에러 메세지의 정확한 위치로 이동해서 확인해보세요.

감사합니다!

0

Hyunsang-Coder

넵! 그런데 에러 위치로 이동하고나서도 뭐가 문제인지 정확히 몰랐었네요.ㅜ 이번 실수로 field선언 할 때 json의 파일명이 완전히 같아야 한다는 걸 몸소 깨닫게 되어서 다시는 같은 실수를 반복할 일은 없을 것 같습니다 :)

0

Hyunsang-Coder

자고 일어나서 맑은 정신으로 다시 보니 10분만에 문제가 해결되네요 ^^;; http요청 보낼 때 productId가 아니라 productID로 보내고 있었네요 ㅜㅜ 잠시나마 "혹시 서버나 코드에 문제가 있던 거 아닌가?"하고 의심했던 점 사과드립니다! 늘 좋은 강의 감사드립니다!!

0

Hyunsang-Coder

try catch 해보면 "flutter: type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast" 이런 메시지가 발생합니다.

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

0

26

0

FlutterSecureStorage 질문

0

25

0

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

0

74

2

관리자 기능에 대한 질문

0

96

2

part 'restaurant_model.g.dart';

0

91

1

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

0

54

2

2번 반환 상황 관련 질문

0

58

2

riverpod 3.0

0

139

2

Asset folder??

0

79

2

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

0

111

2

FutureProvider, StateNotifierProvider 선택 기준

0

68

2

컴포넌트 모델화

0

61

2

쿼리 파라미터

0

81

2

화면 안보임

0

64

2

PaginationListView

0

50

1

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

0

99

2

프로토타입이미지

0

59

2

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

0

82

2

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

0

102

2

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

0

64

2

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

0

104

3

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

0

75

2

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

0

81

2

코딩 작성 순서 관련 질문

0

83

2