SwitchField#
라벨과 보조 설명이 포함된 폼 친화적인 스위치 컴포넌트입니다.
Live Preview#
Web
Receive push notifications.
Flutter
Loading Flutter...
class SwitchFieldDefaultExample extends StatefulComponent {
const SwitchFieldDefaultExample({super.key});
@override
State<SwitchFieldDefaultExample> createState() =>
_SwitchFieldDefaultExampleState();
}
class _SwitchFieldDefaultExampleState
extends State<SwitchFieldDefaultExample> {
bool _value = false;
@override
Component build(BuildContext context) {
return CoSwitchField(
label: 'Enable notifications',
description: 'Receive push notifications.',
value: _value,
onChanged: (v) => setState(() => _value = v),
);
}
}
class SwitchFieldDefaultExample extends StatefulWidget {
const SwitchFieldDefaultExample({super.key});
@override
State<SwitchFieldDefaultExample> createState() =>
_SwitchFieldDefaultExampleState();
}
class _SwitchFieldDefaultExampleState
extends State<SwitchFieldDefaultExample> {
bool _value = false;
@override
Widget build(BuildContext context) {
return CoSwitchField(
label: 'Enable notifications',
description: 'Receive push notifications.',
value: _value,
onChanged: (v) => setState(() => _value = v),
);
}
}
사용 시기 (When to Use)#
이 컴포넌트를 사용하세요:
- 설정 화면에서 기능을 켜거나 끄는 이진 상태를 제어하는 경우
- 라벨과 설명 텍스트가 함께 필요한 스위치 형태의 폼 필드
- 알림, 다크 모드, 자동 저장 등 즉각 효과가 있는 토글 설정
- 폼 내에서 체크박스보다 직관적인 ON/OFF 표현이 필요한 경우
대신 다른 컴포넌트를 사용하세요:
Toggle: 라벨 없이 단독으로 사용하는 간단한 스위치Checkbox: 여러 항목의 선택 여부를 폼 내에서 관리하는 경우RadioGroup: 상호 배타적인 여러 옵션 중 하나를 선택하는 경우
기본 사용법 (Basic Usage)#
// 기본 스위치 필드
CoSwitchField(
value: isNotificationEnabled,
onChanged: handleNotificationToggled,
label: '알림 수신',
)
// 설명 포함
CoSwitchField(
value: isDarkMode,
onChanged: handleDarkModeToggled,
label: '다크 모드',
description: '어두운 테마를 사용합니다',
activeColor: Colors.indigo,
)
// 큰 크기
CoSwitchField(
value: isAutoSave,
onChanged: handleAutoSaveToggled,
label: '자동 저장',
description: '변경 사항을 자동으로 저장합니다',
size: SwitchSize.lg,
)
// 기본 스위치 필드
CoSwitchField(
value: isNotificationEnabled,
onChanged: handleNotificationToggled,
label: '알림 수신',
)
// 설명 텍스트 포함 — description으로 보조 설명 표시
CoSwitchField(
value: isDarkMode,
onChanged: handleDarkModeToggled,
label: '다크 모드',
description: '어두운 테마를 사용합니다',
)
// 비활성화 상태 — enabled: false로 상호작용 차단
CoSwitchField(
value: isAutoSave,
onChanged: handleAutoSaveToggled,
label: '자동 저장',
description: '변경 사항을 자동으로 저장합니다',
enabled: false,
)
Props / Parameters#
| 속성 | 타입 | 기본값 | 설명 |
|---|---|---|---|
value | bool | 필수 | 현재 스위치 상태 |
onChanged |
ValueChanged<bool>? |
null |
상태 변경 콜백 |
label | String | 필수 | 스위치 라벨 |
description |
String? |
null |
보조 설명 텍스트 |
activeColor |
Color? |
null |
활성화 색상 |
size |
SwitchSize |
SwitchSize.md |
스위치 크기 (sm/md/lg) |
enabled | bool | true | 활성화 여부 |
변형 (Variants)#
기본#
CoSwitchField(
value: emailMarketing,
onChanged: handleEmailMarketingToggled,
label: '마케팅 이메일 수신',
)
설명 포함#
CoSwitchField(
value: biometricLogin,
onChanged: handleBiometricToggled,
label: '생체 인증 로그인',
description: '지문 또는 얼굴 인식으로 로그인합니다',
activeColor: Colors.green,
)
동작 스펙 (Behavior)#
인터랙션#
- 클릭/탭: 스위치 토글 또는 레이블/설명 영역 클릭으로 상태 전환
- 호버: 포인터 오버 시 스위치에 시각적 강조 표시
- 포커스: 포커스 링으로 현재 포커스 상태 표시
상태 전환#
off→on(클릭 또는 Space/Enter 입력)on→off(다시 클릭 또는 Space/Enter 입력)disabled상태에서는 모든 인터랙션 무시
즉각 반영 vs 폼 제출#
- 설정 페이지에서 SwitchField는 일반적으로 클릭 즉시 효과 반영
- 폼 내에서 사용 시 다른 필드와 함께 제출 시 반영
사용 가이드라인 (Usage Guidelines)#
✅ Do#
description으로 스위치 효과를 명확히 설명
CouiCoSwitchField(
value: locationTracking,
onChanged: handleLocationTrackingToggled,
label: '위치 정보 수집',
description: '앱 사용 중 위치 데이터를 수집하여 맞춤 서비스를 제공합니다',
)
스위치의 효과와 영향을 설명 텍스트로 명확히 전달하면 사용자가 안심하고 선택할 수 있다.
❌ Don't#
다중 선택이 필요한 경우에 SwitchField 사용
// ❌ 여러 항목 중 다수를 선택해야 하는 경우 Checkbox가 적합
Column(
children: [
CouiCoSwitchField(value: receiveEmail, onChanged: handleEmailToggled, label: '이메일'),
CouiCoSwitchField(value: receiveSms, onChanged: handleSmsToggled, label: 'SMS'),
CouiCoSwitchField(value: receivePush, onChanged: handlePushToggled, label: '푸시 알림'),
// 이런 경우 CheckboxGroup이 더 적합
],
)
다수 항목의 선택/해제를 관리할 때는 Checkbox나 CheckboxGroup이 더 적합하다.
✅ Do#
설정 즉시 적용되는 스위치에 로딩 상태 처리
CouiCoSwitchField(
value: isFeatureEnabled,
onChanged: (value) async {
unawaited(settingsService.updateFeature(value));
handleFeatureToggled(value);
},
label: '베타 기능 사용',
enabled: !isLoading, // API 호출 중 비활성화
)
비동기 설정 변경 중 중복 클릭을 방지하여 일관된 상태를 유지한다.
❌ Don't#
부정적 표현의 라벨 사용
// ❌ 부정 표현은 ON/OFF 상태와 혼란을 야기함
CouiCoSwitchField(
value: isNotificationsDisabled, // 부정 상태를 저장
onChanged: handleNotificationsDisabledToggled,
label: '알림 끄기', // ON이 "알림 끄기"? 혼란스러움
)
스위치 라벨은 항상 긍정형으로 작성해야 ON 상태의 의미가 명확하다.
✅ Do#
레이블을 항상 Switch 옆에 배치하세요.
CouiCoSwitchField(
label: '마케팅 알림 수신',
description: '이벤트 및 프로모션 알림을 받습니다.',
value: marketingEnabled,
onChanged: handleMarketingToggled,
)
레이블 없는 스위치는 무엇을 켜고 끄는지 알 수 없습니다. 레이블과 선택적 설명을 함께 제공하여 명확한 맥락을 만들어야 합니다.
❌ Don't#
Switch로 즉각 실행되는 위험한 동작을 제어하지 마세요.
// ❌ Switch 토글 즉시 계정 삭제 시작
CouiCoSwitchField(
label: '계정 비활성화',
value: isDeactivated,
onChanged: (value) {
if (value) deactivateAccountImmediately(); // 위험한 즉시 실행
},
)
Switch는 즉각적인 ON/OFF 상태 변경에 적합합니다. 계정 삭제, 데이터 초기화 등 위험한 동작은 Dialog로 확인을 받으세요.
접근성 (Accessibility)#
키보드 인터랙션#
| 키 | 동작 |
|---|---|
Space | 스위치 상태 토글 |
Enter | 스위치 상태 토글 |
Tab | 다음 포커스 가능 요소로 이동 |
Shift+Tab | 이전 포커스 가능 요소로 이동 |
스크린 리더#
-
Flutter:
Semantics로switchrole,label,checked상태 전달 (예: "다크 모드, 스위치, 켜짐") -
Web:
role="switch",aria-checked,aria-label(label 텍스트),aria-describedby(description) 자동 적용
터치 타겟#
- 최소 터치 타겟 크기: 48x48dp
- 스위치 + 레이블 전체 영역이 터치 가능 영역
크로스 플랫폼 차이점 (Platform Differences)#
v3.0부터 기본 API (
enabled,onChanged,value등)가 통일되었습니다. 아래는 플랫폼 고유 차이점만 나열합니다.
| 항목 | Flutter | Web |
|---|---|---|
| 클래스명 | CoSwitchField | SwitchField |
| 크기 속성 | SwitchSize enum | CSS 클래스 또는 size 문자열 |
| 색상 속성 | activeColor: Color | CSS 커스텀 프로퍼티 |
| 기본 스타일 | Material/Cupertino | 커스텀 CSS |
관련 컴포넌트 (Related Components)#
- Toggle: 라벨 없이 단독으로 사용하는 최소한의 스위치
- Checkbox: 폼에서 항목 선택 여부를 관리하는 경우
- RadioGroup: 여러 옵션 중 하나를 배타적으로 선택하는 경우
조합 예제#
// SwitchField 목록 + Fieldset 조합: 알림 설정 섹션
CouiFieldset(
legend: '알림 설정',
children: [
CouiCoSwitchField(
value: pushEnabled,
onChanged: handlePushToggled,
label: '푸시 알림',
description: '새 메시지와 업데이트를 알려드립니다',
),
CouiCoSwitchField(
value: emailEnabled,
onChanged: handleEmailToggled,
label: '이메일 알림',
description: '주간 요약 및 중요 공지를 이메일로 받습니다',
),
CouiCoSwitchField(
value: marketingEnabled,
onChanged: handleMarketingToggled,
label: '마케팅 알림',
description: '할인 혜택 및 이벤트 정보를 받습니다',
),
],
)