두 코드의 역할은 같지만, 첫 번째 코드가 더 안전하고 직관적입니다. 반면 두 번째 코드는 일부 문제를 일으킬 수 있습니다. 차이점과 문제점을 상세하게 설명드릴게요.
final dateExists = schedules.containsKey(schedule.date);
final List<Schedule> existingSchedules =
dateExists ? schedules[schedule.date]! : [];
existingSchedules.add(schedule);
setState(() {
schedules = {
...schedules,
schedule.date: existingSchedules,
};
});
dateExists 확인
schedules.containsKey(schedule.date)를 사용해 해당 날짜에 이미 일정이 있는지 확인합니다.true인 경우: schedules[schedule.date]!를 가져옵니다 (이미 존재하는 리스트).false인 경우: 빈 리스트 []를 사용합니다.리스트에 일정 추가
existingSchedules.add(schedule);를 통해 일정 리스트에 새로운 일정을 추가합니다.스프레드 연산자(...)를 사용해 기존 Map 유지
...schedules는 기존의 schedules Map에 있는 모든 키-값 쌍을 복사합니다. schedule.date: existingSchedules를 통해 해당 날짜에 새 리스트를 추가 또는 업데이트합니다....를 사용하면 기존의 Map 내용이 그대로 복사됩니다. schedule.date)의 값만 업데이트됩니다.setState(() {
schedules = {
...schedules, // 기존의 모든 키-값 쌍을 유지
schedule.date: [
if (schedules.containsKey(schedule.date))
...schedules[schedule.date]!, // 기존 리스트 복사
]
};
});
목적
...schedules[schedule.date]!)해서 유지하려고 합니다.문제
schedule)을 넣는 코드가 없습니다. schedules에 저장됩니다.schedule이 추가되지 않고 기존 일정만 유지됩니다.| 구분 | 첫 번째 코드 | 두 번째 코드 |
|---|---|---|
| 역할 | 기존 일정을 유지하면서 새 일정 추가 | 기존 일정만 복사(새로운 일정 추가 안 됨) |
| 기존 항목 유지 | 기존 항목을 유지하고 새 항목 추가 | 기존 항목은 유지하지만 새 항목을 추가 안 함 |
| 문제 발생 여부 | 문제 없음 | 새로운 일정이 누락됨 |
새로운 일정을 추가하면서 기존 일정도 유지하려면 첫 번째 코드처럼 작성해야 합니다:
final dateExists = schedules.containsKey(schedule.date);
final List<Schedule> existingSchedules =
dateExists ? schedules[schedule.date]! : []; // 기존 리스트 또는 빈 리스트 가져오기
existingSchedules.add(schedule); // 새로운 일정 추가
setState(() {
schedules = {
...schedules, // 기존 맵 복사
schedule.date: existingSchedules, // 해당 날짜의 리스트 업데이트
};
});
setState(() {
schedules = {
...schedules,
schedule.date: [
if (schedules.containsKey(schedule.date))
...schedules[schedule.date]!, // 기존 리스트 복사
schedule, // 새로운 일정 추가
],
};
});
이제 기존 일정도 유지되고 새로운 일정도 추가됩니다! 😊