inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Flutter 앱 개발 실전

ProductRepository 의존성 주입

riverpod 코드 변경 질문

해결된 질문

275

Link

작성한 질문수 15

1

안녕하세요.

Provider 로 된 코드를 Riverpod 로 변경 해보려고 하면 벽에 부딪쳐네요.

class CartService with ChangeNotifier {
  List<CartItem> _cartItemList = const [];
  List<CartItem> get cartItemList => _cartItemList; // 상품 목록

  // 선택된 상품 목록
  List<CartItem> get selectedCartItemList {
    return _cartItemList.where((cartItem) => cartItem.isSelected).toImmutable();
    // cartItemList에서 isSelected 값이 true 항목만 불변 배열로 반환하는 Getter를 구현
  }

  // 상품 추가
  void add(CartItem newCartItem){
    _cartItemList = [..._cartItemList, newCartItem].toImmutable();
    notifyListeners();
  }

  // 상품 수정
  void update(int selectedIndex, CartItem newCartItem) {
    _cartItemList = _cartItemList.asMap().entries.map((entry) {
      return entry.key == selectedIndex ? newCartItem : entry.value;
    }).toImmutable();
    notifyListeners();
    /***
     * 업데이트하고 싶은 항목의 인덱스인 selectedIndex에 해당하는 항목을
     * 새로운 newCartItem으로 변경하여 새로운 불변 배열을 생성하도록 구현
     */
  }

  // 상품 삭제
  void delete(List<CartItem> deleteList){
    _cartItemList = _cartItemList.where((cartItem) {
      return !deleteList.contains(cartItem);
    }).toImmutable();
    notifyListeners();
    /***
     * 삭제하고 싶은 목록을 deleteList로 전달받고,
     * 해당 배열에 들어있지 않은 CartItem만 남긴 불변 배열을 생성하도록 구현
     */
  }
}

 

위 코드를 아래와 같이 변경하고자 일부 구현을 해보고 있습니다.

틀린 부분 수정 및 상품 수정 코드를 어떻게 추가해야 될까요?

final cartProvider = NotifierProvider<CartNotifier, List<CartItem>>(CartNotifier.new);

class CartNotifier extends Notifier<List<CartItem>> {
  @override
  List<CartItem> build() => const []; // 상품 목록

  // 상품 추가
  void add(CartItem newCartItem){
    state = [...state, newCartItem];
    // state 는 immutable 데이터이기 때문에 직접적으로 state 를 변경할 수 없다.
  }

  // 상품 삭제
  void delete(List<CartItem> deleteList){
    state = state.where((cartItem) => cartItem != deleteList).toList();
  }

  // 상품 수정
  void update(int selectedIndex, CartItem newCartItem) {
    // CartItem 에 유니크한 id 값이 없는 거 같고, 선택한 index 값으로 찾아서 update 해야 하는데 모르겠음.

  }

  /*
  state = [
      for (final item in state)
        if (item.id == id)
          newCartItem
        else
          item,
    ];
   */

  // 선택된 상품 목록
  List<CartItem> get selectedCartItemList {
    return state.where((cartItem) => cartItem.isSelected).toList();
  }

}

 

 

flutter

답변 1

1

DevStory

안녕하세요.

Provider로 되어 있는 CartService를 Riverpod으로 변경한 결과 공유드립니다.

  • 기존에도 불변 객체를 활용하도록 구현되어 있어서 기존 로직을 그대로 활용하되 notifyListeners();를 제거하였습니다.

  • List<CartItem> _cartItemList = const [];가 Riverpod Notifierstate로 변경되었으니 기존 _cartItemListstate로 변경해주시면 됩니다.

final cartProvider = NotifierProvider<CartNotifier, List<CartItem>>(CartNotifier.new);


class CartService extends Notifier<List<CartItem>> {
  @override
  List<CartItem> build() => const [];

  /// 선택된 상품 목록
  List<CartItem> get selectedCartItemList {
    return state.where((cartItem) => cartItem.isSelected).toImmutable();
  }

  /// 상품 추가
  void add(CartItem newCartItem) {
    state = [...state, newCartItem].toImmutable();
  }

  /// 상품 수정
  void update(int selectedIndex, CartItem newCartItem) {
    state = state.asMap().entries.map((entry) {
      return entry.key == selectedIndex ? newCartItem : entry.value;
    }).toImmutable();
  }

  /// 상품 목록 삭제
  void delete(List<CartItem> deleteList) {
    state = state.where((cartItem) {
      return !deleteList.contains(cartItem);
    }).toImmutable();
  }
}

감사합니다 :)

1

Link

넘 감사합니다.

1

Link

Android Studio 에서 위 코드로 테스트를 하니까 toImmutable() 에 에러 표시줄이 생기네요.

그래서 아래와 같이 코드 변경했습니다.

final cartProvider =
    NotifierProvider<CartNotifier, List<CartItem>>(CartNotifier.new);

class CartNotifier extends Notifier<List<CartItem>> {
  @override
  List<CartItem> build() => const []; // 상품 목록

  // 상품 추가
  void add(CartItem newCartItem) {
    state = [...state, newCartItem];
    // state 는 immutable 데이터이기 때문에 직접적으로 state 를 변경할 수 없다.
  }

  // 상품 삭제
  void delete(List<CartItem> deleteList) {
    state = state.where((cartItem) => !deleteList.contains(cartItem)).toList();
  }

  // 상품 수정
  void update(int selectedIndex, CartItem newCartItem) {
    state = state
        .asMap()
        .entries
        .map((entry) => entry.key == selectedIndex ? newCartItem : entry.value)
        .toList();
  }

  // 선택된 상품 목록
  List<CartItem> get selectedCartItemList =>
      state.where((cartItem) => cartItem.isSelected).toList();

}

1

DevStory

toImmutable() 함수는 별도로 직접 만든 함수라서 에러가 발생하시는 것 같습니다. 자세한 내용은 강의를 참고해 주세요 :)

수강 기한 연장 요청드려도될까요..

1

48

2

37.provider 실습 문제점, 카트에서 상품이 지워지지 않습니다.

1

76

2

다트 프로젝트

1

51

2

context.read<LangService>().toggleLang 해도 언어가 변경되는 이유

1

74

3

수강 기간 연장 신청 요청드립니다.

1

68

3

수강기간 연장 부탁드립니다.

1

58

3

제공해주신 flutter_design_system 라이브러리 질문입니다.

1

53

2

수강 기간 연장 부탁드립니다

1

52

2

수강 기한 연장

1

78

3

강의 잘 보고있습니다!

1

59

2

애뮬레이터 실행 오류

1

69

2

pdf 강의노트

1

62

2

수강기간 연장 부탁드립니다.

1

86

2

수강 기간 연장 요청

1

86

2

수강기간 연장 부탁드립니다

1

129

2

코드 생성기 - build runner 관련 오류

1

111

1

디자인 시스템 구성에 대해 질문 드립니다

2

145

2

CartItem 추가시

1

95

2

const 커스텀클래스

1

95

1

강의 수강 기간 연장 요청드립니다.

1

127

2

코드 생성기 - 실습 build runner 안 되는 분.

1

270

2

Flutter 강의자료 열리지 않는 문제

1

165

2

riverpod 프로젝트에 궁금한점이 있어 질문 남깁니다.

1

123

2

수강 기강 연장 부탁드리겠습니다! :ㅇ

1

88

2