basketProvider에서 patchBasket 함수 호출 시 에러가 발생합니다
326
5 asked
제 코드는 아래와 같고,
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시간 넘게 씨름 중인데 도움 주시면 감사하겠습니다!
Answer 3
0
안녕하세요!
에러 메세지에서도 모델의 g파일을 가리키고 있습니다.
다음에 에러 메세지가 있을때는 꼭 에러 메세지의 정확한 위치로 이동해서 확인해보세요.
감사합니다!
0
넵! 그런데 에러 위치로 이동하고나서도 뭐가 문제인지 정확히 몰랐었네요.ㅜ 이번 실수로 field선언 할 때 json의 파일명이 완전히 같아야 한다는 걸 몸소 깨닫게 되어서 다시는 같은 실수를 반복할 일은 없을 것 같습니다 :)
0
자고 일어나서 맑은 정신으로 다시 보니 10분만에 문제가 해결되네요 ^^;; http요청 보낼 때 productId가 아니라 productID로 보내고 있었네요 ㅜㅜ 잠시나마 "혹시 서버나 코드에 문제가 있던 거 아닌가?"하고 의심했던 점 사과드립니다! 늘 좋은 강의 감사드립니다!!
0
try catch 해보면 "flutter: type 'Null' is not a subtype of type 'Map<String, dynamic>' in type cast" 이런 메시지가 발생합니다.
Isar 마지막 업데이트는 2년전입니다.
0
25
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

