setState와 스프레드 연산자를 사용한 Map 항목 추가setState(() {
schedules = {
...schedules, // 기존의 모든 키-값 쌍을 유지
schedule.date: [
if (schedules.containsKey(schedule.date))
...schedules[schedule.date]!, // 기존 리스트 복사
]
};
});
이 코드는 Map<DateTime, List<Schedule>> 타입인 schedules에 새로운 항목을 추가하거나 기존 항목을 업데이트하기 위해 작성되었습니다.
하나씩 분석하며, 스프레드 연산자와 조건문을 활용한 Map과 List 처리 방법도 설명합니다.
Map에서 스프레드로 항목추가시 key- value 쌍에서 key가 중복되면 value를 덮어씌운다. List에서 스프레드로 항목 추가시, 값 중복이 가능하다. 위 코드에서 if문을 살펴보면 입력받은 date의 key 값과 쌍을 이루는 value값이 list이므로 여기에 스프레드를 통해 값을 추가할때는 기존값이 삭제되는 것을 걱정하지 않아도 괜찮다
setStateschedules라는 상태 변수가 업데이트되었음을 Flutter에 알리고, 변경된 상태에 따라 UI를 다시 렌더링합니다.setState(() {
// 상태 변경 코드
});...)List<int> numbers = [1, 2, 3];
List<int> newNumbers = [...numbers, 4]; // 결과: [1, 2, 3, 4]if와 함께 사용)List<int> numbers = [1, 2, 3];
List<int> newNumbers = [
...numbers,
if (numbers.contains(3)) 4 // 3이 포함된 경우에만 4 추가
]; // 결과: [1, 2, 3, 4]schedules 변수의 구조:DateTime) → 날짜.List<Schedule>) → 해당 날짜에 연결된 일정들의 리스트.schedules = {
DateTime(2024, 3, 8): [Schedule1, Schedule2],
};schedules = {
...schedules, // 기존의 모든 키-값 쌍 복사
schedule.date: [ // 새로운 키-값 추가 또는 기존 키 업데이트
if (schedules.containsKey(schedule.date))
...schedules[schedule.date]!, // 기존 일정 리스트 복사
]
};
...schedules역할:
기존 schedules의 모든 항목을 새로운 Map에 복사합니다.
→ 기존 데이터를 유지하면서 새로운 데이터를 추가하기 위해 사용.
예시:
Map<String, int> existingMap = {'a': 1, 'b': 2};
Map<String, int> newMap = {
...existingMap, // 기존 항목 복사
'c': 3, // 새로운 항목 추가
};
print(newMap); // 결과: {'a': 1, 'b': 2, 'c': 3}
schedule.date역할:
schedule.date 키를 기준으로 새로운 항목을 추가하거나, 기존 항목을 업데이트합니다.
키가 이미 존재하는 경우:
기존 리스트를 유지하면서 새로운 항목을 추가.
키가 존재하지 않는 경우:
새로운 키와 값을 생성.
if (schedules.containsKey(schedule.date))역할:
해당 날짜(schedule.date)에 이미 일정이 있는지 확인.
조건이 참인 경우:
기존 리스트를 복사하여 새로운 리스트에 포함.
조건이 거짓인 경우:
빈 리스트가 생성됩니다.
...schedules[schedule.date]!역할:
기존의 일정 리스트를 새로운 리스트에 복사합니다.
예시:
List<int> existingList = [1, 2, 3];
List<int> newList = [
...existingList, // 기존 항목 복사
4 // 새로운 항목 추가
];
print(newList); // 결과: [1, 2, 3, 4]
Map<String, int> existingMap = {'a': 1, 'b': 2};
Map<String, int> updatedMap = {
...existingMap, // 기존 항목 복사
'c': 3 // 새로운 항목 추가
};
print(updatedMap); // 결과: {'a': 1, 'b': 2, 'c': 3}
schedules = {
...schedules, // 기존 항목 유지
schedule.date: [ // 새로운 날짜의 리스트 추가
if (schedules.containsKey(schedule.date))
...schedules[schedule.date]!, // 기존 리스트 복사
]
};
List<int> existingList = [1, 2, 3];
List<int> updatedList = [
...existingList, // 기존 리스트 복사
4, // 새로운 항목 추가
];
print(updatedList); // 결과: [1, 2, 3, 4]
| 항목 | Map | List |
|---|---|---|
| 구조 | 키-값 쌍 (예: {'key': value}) | 순차적 값 (예: [value1, value2]) |
| 중복 | 키는 중복 불가, 값은 중복 가능 | 값 중복 가능 |
| 추가 방식 | 키를 지정해 추가 | 순차적으로 추가 |
| 스프레드 사용 | 기존 키-값 쌍 유지, 새로운 키 추가 | 기존 리스트 복사, 새로운 값 추가 |
Flutter 코드에서 스프레드 연산자를 활용하면 데이터를 간결하게 추가 및 확장할 수 있습니다.
위 코드는 기존의 schedules 데이터를 유지하면서 새로운 일정을 안전하게 추가하거나 업데이트하는 방법을 보여줍니다.
setState(() {
schedules = {
...schedules,
schedule.date: [
if (schedules.containsKey(schedule.date))
...schedules[schedule.date]!,
schedule // 새로운 일정 추가,
]
};
});