개요
Padding은 자식 위젯 주위에 빈 공간을 추가하는 레이아웃 위젯입니다.
Padding은 자식 위젯과 외부 위젯 사이에 여백을 만들 때 사용하는 기본적인 레이아웃 위젯입니다. EdgeInsets를 사용하여 상하좌우 각 방향의 여백을 개별적으로 또는 일괄적으로 지정할 수 있습니다. Container의 padding 속성과 동일한 효과를 제공하지만, 다른 스타일링 없이 순수하게 여백만 필요할 때 더 효율적입니다.
언제 사용하나요?
- 위젯 내부에 여백을 추가할 때
- 텍스트나 아이콘 주위에 공간을 만들 때
- 버튼이나 카드의 내부 여백을 설정할 때
- Container의 다른 기능이 필요 없고 padding만 필요할 때
- 레이아웃의 가독성과 사용성을 향상시킬 때
기본 사용법
// 모든 방향에 동일한 여백
Padding({
padding: EdgeInsets.all(16),
child: Text('16픽셀 여백')
})
// 수평/수직 대칭 여백
Padding({
padding: EdgeInsets.symmetric({ horizontal: 20, vertical: 10 }),
child: Text('가로 20, 세로 10')
})
// 개별 방향 지정
Padding({
padding: EdgeInsets.only({ top: 20, left: 10 }),
child: Text('위 20, 왼쪽 10')
})
Props
padding
값: EdgeInsets (기본값: EdgeInsets.all(0))
자식 위젯 주위의 여백을 정의합니다. EdgeInsets 클래스의 정적 메서드를 사용하여 다양한 방식으로 여백을 지정할 수 있습니다.
Padding({
padding: EdgeInsets.all(20),
child: Container({ color: 'blue' })
})
child
값: Widget | undefined
여백을 적용할 자식 위젯입니다.
Padding({
padding: EdgeInsets.all(8),
child: Icon({ icon: Icons.star })
})
EdgeInsets 사용법
EdgeInsets.all()
모든 방향에 동일한 여백을 적용합니다.
Padding({
padding: EdgeInsets.all(16),
child: Text('모든 방향 16픽셀')
})
EdgeInsets.symmetric()
수평과 수직 방향에 대칭적인 여백을 적용합니다.
Padding({
padding: EdgeInsets.symmetric({
horizontal: 24, // 좌우 각 24픽셀
vertical: 12 // 상하 각 12픽셀
}),
child: Text('대칭 여백')
})
EdgeInsets.only()
특정 방향에만 여백을 적용합니다.
Padding({
padding: EdgeInsets.only({
top: 20,
bottom: 10,
left: 15
// right는 0 (기본값)
}),
child: Text('선택적 여백')
})
EdgeInsets.fromLTRB()
왼쪽, 위, 오른쪽, 아래 순서로 여백을 지정합니다.
Padding({
padding: EdgeInsets.fromLTRB({
left: 10,
top: 20,
right: 30,
bottom: 40
}),
child: Text('LTRB 여백')
})
실제 사용 예제
예제 1: 카드 내부 여백
const card = Container({
decoration: BoxDecoration({
color: 'white',
borderRadius: BorderRadius.circular(8),
boxShadow: [
BoxShadow({
color: 'rgba(0, 0, 0, 0.1)',
blurRadius: 4,
offset: { x: 0, y: 2 }
})
]
}),
child: Padding({
padding: EdgeInsets.all(16),
child: Column({
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('카드 제목', {
style: TextStyle({ fontSize: 18, fontWeight: 'bold' })
}),
SizedBox({ height: 8 }),
Text('카드 내용이 여기에 표시됩니다.')
]
})
})
});
예제 2: 리스트 아이템
const listItem = Container({
decoration: BoxDecoration({
border: Border({ bottom: BorderSide({ color: '#E0E0E0' }) })
}),
child: Padding({
padding: EdgeInsets.symmetric({ horizontal: 16, vertical: 12 }),
child: Row({
children: [
Icon({ icon: Icons.folder, color: 'blue' }),
SizedBox({ width: 12 }),
Expanded({
child: Text('문서 폴더')
}),
Icon({ icon: Icons.arrow_forward_ios, size: 16, color: 'gray' })
]
})
})
});
예제 3: 버튼 커스터마이징
const customButton = GestureDetector({
onTap: () => console.log('버튼 클릭'),
child: Container({
decoration: BoxDecoration({
color: 'blue',
borderRadius: BorderRadius.circular(8)
}),
child: Padding({
padding: EdgeInsets.symmetric({ horizontal: 24, vertical: 12 }),
child: Text('커스텀 버튼', {
style: TextStyle({ color: 'white', fontWeight: 'bold' })
})
})
})
});
예제 4: 중첩된 Padding
const nestedPadding = Container({
color: 'lightgray',
child: Padding({
padding: EdgeInsets.all(20), // 외부 여백
child: Container({
color: 'white',
child: Padding({
padding: EdgeInsets.all(10), // 내부 여백
child: Text('중첩된 여백')
})
})
})
});
예제 5: 반응형 여백
const responsivePadding = (isTablet: boolean) => {
return Padding({
padding: EdgeInsets.symmetric({
horizontal: isTablet ? 48 : 16,
vertical: isTablet ? 24 : 12
}),
child: Column({
children: [
Text('반응형 레이아웃'),
Text('디바이스에 따라 여백이 달라집니다')
]
})
});
};
EdgeInsets 속성과 메서드
속성
- top: 상단 여백
- bottom: 하단 여백
- left: 왼쪽 여백
- right: 오른쪽 여백
- horizontal: 좌우 여백의 합 (left + right)
- vertical: 상하 여백의 합 (top + bottom)
메서드
- add(other): 두 EdgeInsets를 더함
- deflateRect(rect): 사각형에서 padding만큼 축소
const padding1 = EdgeInsets.all(10);
const padding2 = EdgeInsets.symmetric({ horizontal: 5 });
const combined = padding1.add(padding2); // 모든 방향 10 + 좌우 5 추가
Container와의 차이점
Padding 사용
// 순수하게 여백만 필요할 때
Padding({
padding: EdgeInsets.all(16),
child: Text('텍스트')
})
Container 사용
// 여백과 함께 다른 스타일도 필요할 때
Container({
padding: EdgeInsets.all(16),
color: 'blue',
decoration: BoxDecoration({ borderRadius: BorderRadius.circular(8) }),
child: Text('텍스트')
})
주의사항
- Padding의 자식으로 Expanded 위젯을 직접 사용할 수 없습니다. Row나 Column 내부에서 사용하세요.
- EdgeInsets의 값은 음수가 될 수 없습니다.
- 과도한 padding은 레이아웃 오버플로우를 일으킬 수 있습니다.
- 중첩된 Padding보다는 EdgeInsets.add()를 사용하여 합친 후 한 번에 적용하는 것이 효율적입니다.
관련 위젯
- Container: padding 외에도 다양한 스타일링 옵션 제공
- AnimatedPadding: 애니메이션이 적용된 padding 변경
- SizedBox: 고정 크기의 빈 공간 생성
- EdgeInsetsDirectional: 텍스트 방향을 고려한 padding
- SafeArea: 시스템 UI를 피하는 padding 자동 적용