Flutter에서 Custom Widget 제대로 만들기 — 재사용 가능한 컴포넌트 설계

2025. 5. 23. 12:59·Flutter
728x90
반응형

Flutter를 처음 시작했을 땐 모든 UI를 직접 구성하는 재미가 있었다.
하지만 프로젝트가 커질수록 반복되는 코드에 지치고, 조금의 수정이 전체 앱에 영향을 주는 일이 생기기 시작했다.

이제 우리는 고민해야 한다. "이걸 위젯으로 분리할 수 없을까?"
Flutter에서 재사용 가능한 Custom Widget을 만드는 일은 유지보수성과 생산성을 모두 높여주는 길이다.


🧱 Stateless vs Stateful 위젯 선택 기준

커스텀 위젯을 만들기 전, 먼저 결정해야 할 건 Stateless로 만들지 Stateful로 만들지이다.

  • StatelessWidget: UI는 고정, 입력만 받아서 출력할 때
  • StatefulWidget: UI가 상태 변화에 따라 바뀔 때

가능하면 Stateless로 시작하고, 필요한 경우 Stateful로 바꾸는 게 좋다.


🛠️ 예제: CustomButton 만들기

기본 Button 대신, 팀 스타일에 맞는 재사용 가능한 버튼을 만들자.

class CustomButton extends StatelessWidget {
  final String label;
  final VoidCallback onPressed;
  final Color color;

  const CustomButton({
    super.key,
    required this.label,
    required this.onPressed,
    this.color = Colors.blue,
  });

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      style: ElevatedButton.styleFrom(
        backgroundColor: color,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(12),
        ),
        padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12),
      ),
      onPressed: onPressed,
      child: Text(label, style: const TextStyle(color: Colors.white)),
    );
  }
}

이제 어디서든 이렇게 사용할 수 있다:

CustomButton(
  label: "등록하기",
  color: Colors.green,
  onPressed: () {
    print("등록됨");
  },
)

📦 Custom Widget을 설계할 때 고려할 것들

  • 불필요한 상태는 외부에서 주입: 최대한 Stateless하게
  • 입력값 (props)은 final로 고정: 변경 불가하게 설계
  • 기본값 제공: 사용자 편의를 위해 기본값 설정
  • Theme과 연동 고려: 앱 전체 테마를 반영할 수 있게
  • 의미 있는 네이밍: 역할이 명확한 이름 사용

📁 컴포넌트 폴더 구조는 어떻게?

/lib
  /components
    custom_button.dart
    custom_card.dart
  /screens
    home_screen.dart

Custom 위젯들을 한 곳에 모아두면, 재사용성과 유지보수가 좋아진다.
나중에 디자인이 변경되더라도 컴포넌트만 수정하면 된다.


🧘 마무리하며

Custom Widget을 만든다는 건 단순히 코드를 줄이는 것이 아니다.
Flutter 앱을 더 읽기 쉽고, 더 유지보수하기 좋게 만드는 첫 걸음이다.

함수를 잘게 쪼개는 것처럼, UI도 잘게 쪼개보자.

✍️ 이 글은 터미널 밖으로 나온 개발자의 Flutter 심화과정입니다.

728x90
반응형

'Flutter' 카테고리의 다른 글

Flutter에서 비동기 완전 이해하기 — Future, Stream, Isolate 이야기  (0) 2025.05.26
애니메이션을 더 깊게 — AnimatedBuilder부터 Tween까지 완전 정복  (0) 2025.05.23
상태 관리 마스터하기 — Provider, Riverpod, Bloc 비교와 선택 가이드  (0) 2025.05.23
Flutter와 네이티브의 연결고리 — Platform Channel 실전 입문  (2) 2025.05.22
CustomPainter 완전 정복 — Flutter에서 나만의 캔버스를 그려보자  (0) 2025.05.22
'Flutter' 카테고리의 다른 글
  • Flutter에서 비동기 완전 이해하기 — Future, Stream, Isolate 이야기
  • 애니메이션을 더 깊게 — AnimatedBuilder부터 Tween까지 완전 정복
  • 상태 관리 마스터하기 — Provider, Riverpod, Bloc 비교와 선택 가이드
  • Flutter와 네이티브의 연결고리 — Platform Channel 실전 입문
코드를 걷는 사람
코드를 걷는 사람
devwanderer 님의 블로그 입니다.
  • 코드를 걷는 사람
    터미널 밖으로 나온 개발자
    코드를 걷는 사람
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • Flutter
        • Flutter 게시판 앱 만들기
        • Flutter 뉴스 앱 만들기
        • Flutter 메모 앱 만들기
        • Flutter 캘린더 앱 만들기
        • Flutter 날씨 앱 만들기
      • Next.js
      • Ruby On Rails N
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Flutter
    flutter기초
    ActiveRecord
    flutter게시판
    코드를걷는사람
    다크모드
    백엔드개발
    flutter상태관리
    RubyOnRails
    Firebase
    openweather
    rails보안
    캘린더앱
    UI디자인
    뉴스앱
    UIUX
    개발블로그
    flutter디자인
    정적사이트
    감성앱
    flutter앱개발
    북마크기능
    fluttertips
    flutter개발
    메모앱
    날씨앱
    모바일앱개발
    Nextjs
    table_calendar
    flutterui
  • 최근 댓글

  • 최근 글

  • 반응형
    250x250
  • hELLO· Designed By정상우.v4.10.3
코드를 걷는 사람
Flutter에서 Custom Widget 제대로 만들기 — 재사용 가능한 컴포넌트 설계
상단으로

티스토리툴바