[Flutter] 상태 관리 앱 만들기 (StatefulWidget 사용)

2025. 2. 3. 09:50·Flutter/App
728x90

2단계: 도서 관리 앱으로 상태 변화 관리하기

💡 도서 관리 앱 - 위젯 트리 구조 (StatefulWidget을 이용한 상태 관리)
homePage (StatefulWidget)
|  ├── 공유 상태: 대출 목록에 추가된 도서 목록 (공유 상태)
|
├── Library (Store 역할)
|     ├── Book 1 (도서 목록)
|     ├── Book 2
|     ├── Book 3
|     └── Book 4
|
└── BorrowList (Cart 역할)
      ├── Book 2 (대출 목록에 추가된 책)
      └── Book 4

 

코드 구성


  • main.dart
import 'package:flutter/material.dart';
import 'home_screen.dart';

void main() {
  runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    theme: ThemeData(
      useMaterial3: true,
      colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
    ),
    home: HomeScreen(),
  ));
}

  • home_screen.dart
import 'package:flutter/material.dart';
import 'book_cart_page.dart';
import 'book_list_page.dart';

class HomeScreen extends StatefulWidget {
  HomeScreen({super.key});

  @override
  State<HomeScreen> createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  int pageIndex = 0; // 현재 페이지 인덱스
  List<String> mySelectedBook = []; // 공유 상태: 선택된 책 목록

  void _toggleSaveStates(String book) {
    setState(() {
      if (mySelectedBook.contains(book)) {
        mySelectedBook.remove(book);
      } else {
        mySelectedBook.add(book);
      }
    });
  }

  void _changePageIndex(int index) {
    setState(() {
      pageIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('텐코의 서재'),
      ),
      body: IndexedStack(
        index: pageIndex,
        children: [
          BookListPage(
            onToggleSaved: _toggleSaveStates,
            mySelectedBooked: mySelectedBook,
          ),
          BookCartPage(
            onToggleSaved: _toggleSaveStates,
            mySelectedBooked: mySelectedBook,
          ),
        ],
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: pageIndex,
        onTap: _changePageIndex,
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.list), label: 'book-list'),
          BottomNavigationBarItem(icon: Icon(Icons.shopping_cart), label: 'book-cart'),
        ],
      ),
    );
  }
}

  • book_list_page.dart
import 'package:flutter/material.dart';

class BookListPage extends StatelessWidget {
  final Function(String) onToggleSaved; // 저장 상태 토글 콜백
  final List<String> mySelectedBooked; // 선택된 책 목록

  BookListPage({
    required this.onToggleSaved,
    required this.mySelectedBooked,
    super.key,
  });

  final List<String> books = [
    '호모사피엔스',
    'dart입문',
    '홍길동전',
    'code Refactoring',
    '전치사도감',
  ]; // 임시 책 목록

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: books.map((book) {
        final isSelected = mySelectedBooked.contains(book);
        return ListTile(
          title: Text(book),
          trailing: IconButton(
            onPressed: () => onToggleSaved(book),
            icon: Icon(
              isSelected ? Icons.remove_circle : Icons.add_circle,
              color: isSelected ? Colors.red : Colors.green,
            ),
          ),
        );
      }).toList(),
    );
  }
}

  • book_cart_page.dart
import 'package:flutter/material.dart';

class BookCartPage extends StatelessWidget {
  final Function(String) onToggleSaved; // 저장 상태 토글 콜백
  final List<String> mySelectedBooked; // 선택된 책 목록

  const BookCartPage({
    required this.onToggleSaved,
    required this.mySelectedBooked,
    super.key,
  });

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: mySelectedBooked.map((book) {
        return ListTile(
          title: Text(book),
          trailing: IconButton(
            onPressed: () => onToggleSaved(book),
            icon: Icon(Icons.remove_circle, color: Colors.red),
          ),
        );
      }).toList(),
    );
  }
}

 Flutter에서 StatefulWidget으로 상태를 관리하는 방법을 보여주는 예제이다. 앱에서 책을 선택하거나 삭제하면서 상태를 공유하는 기본 구조다. 도움이 됐길 바라고, 궁금한 게 있으면 언제든 물어보세요!😊


1단계가 궁금하다면?

 

[Flutter] 상태 관리 앱 만들기 (stl, stf)

💡 우리가 배울 여러 상태 관리 방법을 이용해 데이터 일관성을 유지 해보자!StatefulWidgetInheritedWidgetProvider(라이브러리)Riverpod(라이브러리)1단계: 기본 위젯 (StatelessWidget & StatefulWidget) 💡  Stateless

seohong.tistory.com

 

'Flutter > App' 카테고리의 다른 글

[Flutter] 상태 관리 앱 만들기 (라이브러리 사용)  (0) 2025.02.05
[Flutter]상태 관리 앱 만들기 (nheritedWidget 사용)  (0) 2025.02.03
[Flutter] 상태 관리 앱 만들기 (stl, stf)  (1) 2025.02.03
[Flutter] 연습하기 4 - Flutter Shopping Cart app  (1) 2025.01.14
[Flutter] 연습하기 4 - Flutter Login app  (0) 2025.01.13
'Flutter/App' 카테고리의 다른 글
  • [Flutter] 상태 관리 앱 만들기 (라이브러리 사용)
  • [Flutter]상태 관리 앱 만들기 (nheritedWidget 사용)
  • [Flutter] 상태 관리 앱 만들기 (stl, stf)
  • [Flutter] 연습하기 4 - Flutter Shopping Cart app
공돌이 출신 개발자
공돌이 출신 개발자
공돌이 출신 개발자입니다
  • 공돌이 출신 개발자
    공돌이 출신 개발자
    공돌이 출신 개발자
  • 전체
    오늘
    어제
    • 분류 전체보기 (124)
      • Database (0)
        • SQL (0)
        • 1일 1쿼리 (9)
      • Flutter (40)
        • Dart 언어 (18)
        • App (22)
      • Git (0)
      • Http 기초 지식 (14)
      • HTML5 & CSS3 (0)
      • Java (33)
      • JSP (0)
      • JavaScript (0)
      • Linux (0)
      • MSA (0)
      • Project (0)
      • React (0)
      • Spring (19)
      • 설치 메뉴얼 (1)
      • [Flutter] 프로젝트 (눈길) (8)
        • 작업일지 (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    프로그래밍
    블로그 만들기
    프로젝트
    객체
    공부
    회원가입
    앱개발
    개발
    SQL
    Android
    로그인
    jsp
    SQLD
    안드로이드
    flutter
    메서드
    데이터
    JAVA 기초
    Java
    클래스
    앱 개발
    플러터
    1일1쿼리
    안드로이드 앱 개발
    객체지향
    코딩
    android studio
    HTTP
    spring boot
    dart
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
공돌이 출신 개발자
[Flutter] 상태 관리 앱 만들기 (StatefulWidget 사용)
상단으로

티스토리툴바