inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Flutter 앱 개발 기초

실습. 한 줄 일기

Bucket Provider 대신에 Riverpod 로 변경해보고 싶어요.

해결된 질문

229

Link

작성한 질문수 15

1

안녕하세요. 3강 강의를 듣고 질문드립니다.

상태관리는 Riverpod 로 변경해보고 싶은데 잘 안됩니다.

/// 버킷 클래스
class Bucket {
  String job; // 할 일
  bool isDone; // 완료 여부

  Bucket(this.job, this.isDone); // 생성자
}

Provider 의 BucketService

class BucketService extends ChangeNotifier {
  List<Bucket> bucketList = [
    //Bucket('잠자기', false), // 더미데이터
  ];

  /// bucket 추가
  void createBucket(String job){
    bucketList.add(Bucket(job, false));
    notifyListeners();
  }

  /// bucket 수정
  void updateBucket(Bucket bucket, int index){
    bucketList[index] = bucket;
    notifyListeners();
  }

  /// bucket 삭제
  void deleteBucket(int index){
    bucketList.removeAt(index);
    notifyListeners();
  }
}

이걸 Riverpod v2 기준으로 변경해보고 싶은데 매개변수를 그대로 사용하면서 할 수 있는 방법을 모르겠습니다.

final bucketProvider = NotifierProvider<BucketNotifier, List<Bucket>>(BucketNotifier.new);

class BucketNotifier extends Notifier<List<Bucket>> {
  @override
  List<Bucket> build() => [];

  /// bucket 추가
  void createBucket(String job){
    state = [...state, Bucket(job, false)];
  }

  /// bucket 수정
  void updateBucket(Bucket bucket, int index){

  }

  /// bucket 삭제
  void deleteBucket(int index){
    //state = state.where((element) => element != index).toList();
    // element 에는 index 가 없는데 어떻게 비교할 수 있을까?
  }

}

 

 

flutter

답변 1

1

DevStory

안녕하세요

주석에 남겨두신 element 에는 index 가 없는데 어떻게 비교할 수 있을까?에 대한 답변 드립니다.

state = state.where((element) => element != index).toList();

특정 index의 값을 제거한 새로운 배열을 반환하는 두 가지 방법 소개드립니다.

state = [
    ...state.sublist(0, index),
    ...state.sublist(index + 1),
];
state = List.from(state)..removeAt(index);

감사합니다.

0

Link

정말 감사드립니다.

두번쩨 방법으로 해보니 잘 되는 거 확인했습니다.

/// bucket 수정
  void updateBucket(Bucket bucket, int index){

  }

bucket 수정 함수 코드는 어떻게 작성할 수 있을까요?

 

다른 방법으로는 모델에 id를 추가해서 아래와 같은 코드로 동작하는 건 확인했습니다.

/// 버킷 클래스
class Bucket {
  String id;
  String job; // 할 일
  bool isDone; // 완료 여부

  Bucket(this.id, this.job, this.isDone); // 생성자
}
final bucketProvider = NotifierProvider<BucketNotifier, List<Bucket>>(BucketNotifier.new);

class BucketNotifier extends Notifier<List<Bucket>> {
  @override
  List<Bucket> build() => [];

  /// bucket 추가
  void createBucket(String job){
    state = [...state, Bucket((state.length + 1).toString(),job, false)];
  }

  /// bucket 수정
  void updateBucket(Bucket bucket){
    print('${bucket.id} ::: ${bucket.job}');
    state = [
      for(final item in state)
        if(item.id == bucket.id)
          Bucket(item.id, bucket.job, bucket.isDone)
        else
          item
    ];
  }

  /// bucket 삭제
  void deleteBucket(int index){
    //state = state.where((e) => e.id != bucket.id).toList(); // Bucket bucket 인자로 받을 때
    state = List.from(state)..removeAt(index);
  }

}

0

DevStory

수정은 다음 방법들을 참고해 주세요.

state = state.map((e) => e.id == bucket.id ? bucket : e).toList()
state = [
   for(int i=0; i<state.length; i++) i == index ? bucket : state[i]
];
state = [
  for(final e in state) state.id == e.id ? bucket : e
];
state = [
  ...state.sublist(0, index),
  bucket,
  ...state.sublist(index + 1),
].toList();

감사합니다 :)

회차마다 있는 실습

1

38

2

user-not-found, wrong-password 코드가 더 이상 반환되지 않습니다

1

70

2

SharedPreferences prefs 초기화 시기 문제

1

84

2

index로 삭제하게 되면, index가 고정되어 있으니 문제가 발생하지 않나요?

1

62

2

API 사이트가 안되네요

1

77

2

잘 되다가 sharedPreferences부터 에러

1

63

2

기존의 프로젝트

1

63

2

I/O라는 창이 윈도우에서는 없어요

1

61

2

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

1

59

2

설정 질문

1

55

2

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

1

49

2

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

1

54

2

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

1

55

2

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

1

66

3

강의계획 문의

1

63

2

안녕하세요. 강의 연장 문의드립니다..

1

72

2

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

1

78

2

2회차 StatefulWidget 예제 dartpad 코드와 영상에서의 코드가 다릅니다.

2

95

2

dartpad 에러

1

103

2

cmd에 flutter doctor 입력하면 바로 튕겨버립니다...

1

108

2

애뮬레이터 실행시 무한로딩

1

132

2

저는 강사님 처럼 화면이 안뜨는데 머테리얼 버전이 다른걸까요??

1

64

2

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

1

58

2

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

1

67

2