728x90

★★★트러블 슈팅 28

Flutter의 Sliver 시스템에서는 위젯 타입 간의 호환성 규칙

문제는 WeatherProductRecommendationWidget이 SliverList를 반환하는데, 이것을 SliverToBoxAdapter 안에 넣으려고 해서 발생했습니다. 수정된 코드를 보여드리겠습니다:WeatherScreen.dart의 CustomScrollView 부분을 다음과 같이 수정:CustomScrollView( slivers: [ SliverToBoxAdapter( child: WeatherWidget(), ), SliverToBoxAdapter( child: LocationWidget(), ), SliverToBoxAdapter( child: WeatherStatsSection(), ), // SliverToBoxA..

ai추천에서 받아올때 상품 ID만 받아오는지?

OpenAI로부터 데이터를 받을 때 처리 방식은 두 가지 흐름 중 하나를 따릅니다. 코드를 분석한 결과, OpenAI는 상품 ID만 반환하며, 상품의 나머지 상세 정보는 Firestore에서 가져옵니다.  데이터 처리 방식1. OpenAI로부터 받은 데이터OpenAI는 상품 ID와 추천 이유를 JSON 형태로 반환합니다. 반환된 데이터는 상품의 ID만 포함하며, 실제 상품 정보는 포함되어 있지 않습니다.OpenAI 응답 데이터 예시:{ "products": ["상품ID1", "상품ID2", "상품ID3"], "reasons": { "상품ID1": "추천 이유 1", "상품ID2": "추천 이유 2", "상품ID3": "추천 이유 3" }}2. Firestore에서 상세 정보 가져오기..

대부분의 트러블 슈팅은 줄바꿈 문제

Dart에서 JSON 데이터 처리 중 줄바꿈이나 공백으로 인한 타입 에러가 발생하는 이유는 주로 데이터 형식이 JSON 표준에 부합하지 않거나, Dart가 문자열을 JSON으로 변환할 때 기대하지 않은 방식으로 해석하기 때문입니다. 이는 JSON 데이터가 의도한 형식이 아닌 잘못된 타입으로 파싱될 때 발생할 수 있습니다.원인과 해결 방법1. JSON 문자열 형식 문제줄바꿈이나 공백이 JSON 문자열 안에 잘못 포함되어 있을 경우 Dart의 jsonDecode 함수가 올바르게 파싱하지 못합니다.문제 상황예를 들어, 다음과 같은 JSON 데이터가 있다고 가정해봅시다:const jsonString = '''{ "name": "Glow Cream", "price": 25000}''';여기서 "price" ..

BlocListener는 Bloc 상태 관리에서 매우 유용한 위젯

초기화 할때 너무 좋더라히스토리 화면에서 상품이 바로 안보여서 문제가 되었는데,다른 패키지 하는것보다 블럭 리스너 쓰면 프로바이더 워피 퍼럼 되면서일이 깔끔해졌따. ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ BlocListener는 Bloc 상태 관리에서 매우 유용한 위젯입니다. 주요 특징과 기능을 설명드리겠습니다:기본 구조: BlocListener( listener: (context, state) { // 상태 변화에 따른 사이드 이펙트 처리 }, listenWhen: (previous, current) { // 특정 조건에서만 listener 실행 return true/false; }, child: Widget(...),) 주요 특징:BlocBuilder와 달리 ..

파베 블록만 써서가져오지말고, 레퍼지토리 거쳐야하는 이유: 수정

근데 생각해보니 UI (이벤트 발생) -> Bloc (직접 Firestore 쿼리) -> Firestore -> Bloc (데이터 변환) -> UI (상태 업데이트) 이런 구조나 UI -> Bloc -> Repository -> Firestore -> Repository -> Bloc -> UI 이 구조나 코드 생긴게 안이뻐서 그렇지, 어차피 기능상 문제 없는거 아냐? 블럭만 쓰면 기능상 심각한 차이가 있어? A  읽어보니 가장 큰 문제는 블록 사용하면 수정시 관련된 블럭마다 수정해 줘야함  기능상으로는 심각한 차이가 없습니다. 둘 다 데이터를 정상적으로 가져올 수 있죠. 하지만 실제 프로젝트에서 중요한 차이점들이 있습니다:실제 프로젝트 상황 // 1. 같은 쿼리가 여러 곳에서 필요한 경우class To..

파베에서 데이터 끌어올때 블록만?VS 레퍼지토리 같이?

결론은 레퍼지토리와 같이 해야한다 그래야 다른곳에서도 끌어올 수 있다.파이어베이스 데이터 접근을 Repository vs Bloc에서 직접 처리하는 것의 주요 차이점을 설명하겠습니다: 1. 관심사의 분리 (Separation of Concerns) ```dart // Repository 패턴 사용 class TodaySaleRepository {   Future> getTodaySaleProducts() async {     final snapshot = await _firestore         .collection('products')         .where('discountPercent', isGreaterThanOrEqualTo: 40)         .get();     return sna..

Map<String, dynamic> 방식

Map를 써야 타입 변환이 자유롭고 나중에 필드값 추가하기 용이하다Json과도 호환이 잘된다DocumentSnapshot 는 타입 변환도 힘들고 호환이 잘 안된다. Q1. ProductModel이 Firestore의 DocumentSnapshot을 직접 처리해야 한다는 건 무슨 의미인가요?A1: DocumentSnapshot은 Firestore에서 데이터를 가져올 때 사용하는 Firestore 고유의 데이터 타입입니다. 만약 ProductModel이 DocumentSnapshot을 직접 처리하도록 작성되어 있다면, 모델 클래스가 Firestore에 종속되어 Firestore에서 가져온 데이터만을 처리할 수 있게 됩니다. 다른 데이터 소스, 예를 들어 JSON 파일이나 로컬 데이터베이스에서 온 데이터를 그..

date time 타입변화 에러

final popularProducts = popularSnapshot.docs.map((doc) { Map data = doc.data() as Map; data['productId'] = doc.id; return ProductModel.fromMap(data); }).toList();이렇게 바뀌는게 무슨 상황이야? 어떤 의미가 있어?  이 코드의 변환 과정을 단계별로 설명해드리겠습니다:popularSnapshot.docs는 Firestore에서 가져온 문서들의 리스트입니다.각 문서(doc)에 대해Map data = doc.data() as Map; doc.data()는 Firestore 문서의 실제 데이터를 가져옵니다이 데이터를 Map 타입으로 변환합니다이 Map에는 제품의 name, price, ..

호출순서에 따라 구현이 안되는 문제

일반배송, 픽업 탭에서 밑에 가격 계산을 따로 했는데, 일반배송의 가격이 픽업 눌러도 업데이트가 안되었다.이유가 픽업탭을 눌러도 상품체크전에 가격 계산이 된것.호출순서를 바꿔서 탭 누르면 상품배송 선택하고 거기에 가격계산 하도록 초기화로 순서를 정했다. 장바구니의 탭 전환 시 가격 정보 업데이트 문제 해결 과정을 정리하겠습니다.문제 상황:탭 전환 시 하단 가격 정보가 때때로 이전 탭의 정보를 유지함탭 전환과 가격 업데이트의 비동기적 처리로 인한 타이밍 이슈 발생원인 분석:탭 컨트롤러가 탭 변경을 감지하고 상품 선택 상태를 변경하는 과정이 가격 계산보다 늦게 실행될 수 있음상태 관리가 TabController와 Bloc 간에 동기화되지 않음해결 방법: // 1. CartState에 현재 탭 상태 추가cla..

728x90