강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

kindjin12님의 프로필 이미지
kindjin12

작성한 질문수

Flutter 앱 개발 기초

버킷 리스트 앱 만들기

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

해결된 질문

작성

·

16

1

bucketlist의 index와 삭제할 index가 다르게 되는 상황이 발생하지 않나요?

 

제가 직접 설명하긴 어려워서 ai 답변 올립니다

index 캡처 문제가 있습니다

 

// 1. IconButton 클릭 → showDeleteDialog(context, index) 호출
onPressed: () { showDeleteDialog(context, index); }, // index=1 (예시)

// 2. Dialog에서 onPressed 호출 시
TextButton(
  onPressed: () {
    setState(() {
      bucketList.removeAt(index); // ❌ index=1 고정 (Dialog 동안 리스트 변경됨)
    });
  },
)

Dialog가 열리는 동안 다른 항목 삭제 → index 무효화 → 잘못된 항목 삭제


답변 2

1

DevStory님의 프로필 이미지
DevStory
지식공유자

안녕하세요.

onPressed로 전달되는 함수는 클릭을 하는 시점의 상태를 기반으로 Index를 전달하기 때문에, Index는 고정되어 있지 않아 잘못된 항목이 삭제되진 않습니다. 즉 Dialog를 띄울 때 마다 새로 갱신된 Index를 전달한다고 보시면 되는데, 혹시라도 문제가 발생하신다면 재현 방법을 알려주시면 확인해 보도록 하겠습니다.

감사합니다 🙂

0

안녕하세요, 인프런 AI 인턴입니다. kindjin12님.

Flutter 앱 개발에서 index를 기반으로 아이템을 삭제할 때 발생할 수 있는 문제에 대해 질문해 주셨군요. Dialog가 열려있고 사용자가 다른 항목을 삭제하면, 삭제하려는 index가 올바르지 않을 수 있다는 문제를 제기하셨습니다.

이는 실제로 발생할 수 있는 문제로, 다른 UI 액션이 있을 때 List의 상태가 변할 수 있기 때문입니다. 이를 방지하기 위해 매개변수로 전달되는 index 대신 객체의 고유한 식별자(ID)를 이용하여 삭제를 수행하는 것이 일반적입니다. 이를 통해 삭제가 정확한 대상에 대해 수행되도록 보장할 수 있습니다.

그렇다면 어떻게 하면 좋을지 구체적으로 설명드리겠습니다. 다음과 같이 구현할 수 있습니다:

  1. 각 Bucket에 ID 추가: 데이터를 관리할 때 식별자를 사용하여 특정 항목을 찾을 수 있도록 합니다.
class Bucket {
  final String id; // 고유 식별자
  final String job;
  final bool isDone;

  Bucket(this.id, this.job, this.isDone);
}
  1. 삭제 함수 수정: index 대신 ID로 삭제하는 방법을 사용합니다.
void deleteBucket(String bucketId) {
  state = state.where((bucket) => bucket.id != bucketId).toList();
}
  1. Dialog에서 ID 사용: 사용자 인터페이스에서 ID를 기반으로 작업을 수행하도록 합니다.
onPressed: () {
  String bucketId = bucketList[index].id; // 현재 요소의 ID
  showDeleteDialog(context, bucketId);
},

이 접근법을 통해, 리스트에서 다른 아이템을 삭제하거나 다른 변동이 있더라도 정확히 원하는 대상을 선택하여 수정 및 삭제할 수 있습니다.

비슷한 문제와 해결 방법에 대한 논의가 이루어진 페이지를 참고해 보시면 도움이 될 것입니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

kindjin12님의 프로필 이미지
kindjin12

작성한 질문수

질문하기