공부/코딩

Flutter로 리스트 페이지 만들기

확두뇌 2025. 1. 11. 15:21

 

flutter 프로젝트 생성하기 - 프로젝트 이름은 모두 소문자로 작성하기

* 이미지 삽입 시에는 assets 폴더 아래에 이미지 넣기

main.dart에 코드 작성

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

//return 다음에 넣고 싶은 코드 작성하기
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return ShopItem();
  }
}

//자주 쓰는 코드나 블럭은 class로 만들어 묶어 놓으면 재사용 편리함
class ShopItem extends StatelessWidget {
  const ShopItem({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
	  //MaterialApp으로 작성하면 여러 기본 설정들이 자동으로 되서 편함
    return MaterialApp(
    
	    //3단계 구성으로 home, body, bottomNavigationBar으로 구분해서 만들 수 있음
      home: Scaffold(
        appBar: AppBar(
          title: Text("상암동"),
          backgroundColor: Colors.blueGrey,
          leading: IconButton(
            icon: Icon(Icons.search),
            onPressed: () {
              // 돋보기 아이콘을 눌렀을 때의 동작
            },
          ),
          actions: [
            IconButton(
              icon: Icon(Icons.more_vert), // 종 모양 아이콘
              onPressed: () {
                // 종 모양 아이콘을 눌렀을 때의 동작
              },
            ),
          ],
        ),
        body: ListView(  //ListView로 감싸면 내용물이 늘어나면 스크롤이 자동으로 생성됨
          padding: EdgeInsets.all(10),
          children: [
            SizedBox(height: 10),
            ShopItemGroup(image: 'image.png', text: '역세권. 도보 3분 거리. 남향. 보증금 없음. 화장실 2개. 방 3개. 조건 맞춰 드려요. 선납 가능.', price: '월 100만원'),
            SizedBox(height: 10),
            ShopItemGroup(image: 'image2.png', text: '역세권. 도보 3분 거리. 남향. 보증금 없음. 화장실 2개. 방 3개. 조건 맞춰 드려요. 선납 가능.', price: '월 100만원'),
            SizedBox(height: 10),
            ShopItemGroup(image: 'image3.png', text: '역세권. 도보 3분 거리. 남향. 보증금 없음. 화장실 2개. 방 3개. 조건 맞춰 드려요. 선납 가능.', price: '월 100만원'),
            SizedBox(height: 10),
            ShopItemGroup(image: 'image.png', text: '역세권. 도보 3분 거리. 남향. 보증금 없음. 화장실 2개. 방 3개. 조건 맞춰 드려요. 선납 가능.', price: '월 100만원'),
            // 추가 그룹을 필요한 만큼 계속 추가할 수 있습니다.
          ],
        ),
        bottomNavigationBar: BottomAppBar(
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              Icon(Icons.phone),
              Icon(Icons.message),
              Icon(Icons.contact_page)
            ],
          ),
        ),
      ),
    );
  }
}

//그룹으로 묶어서 관리함
class ShopItemGroup extends StatelessWidget {
  final String image;
  final String text;
  final String price;

  const ShopItemGroup({
    Key? key,
    required this.image,
    required this.text,
    required this.price,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Expanded(
          child: Image.asset(image),
        ),
        Expanded(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text(
                text,
                style: TextStyle(fontSize: 20.0),
                maxLines: null, // null로 설정하여 줄 바꿈을 자동으로 처리
                overflow: TextOverflow.clip, // 텍스트가 오버플로우 되었을 때 잘리지 않고 클립되도록 설정
              ),
              SizedBox(height: 8.0), // 각 텍스트 사이에 간격을 주기 위해 SizedBox 추가
              Text(
                price,
                style: TextStyle(fontSize: 12.0),
                maxLines: null, // null로 설정하여 줄 바꿈을 자동으로 처리
                overflow: TextOverflow.clip, // 텍스트가 오버플로우 되었을 때 잘리지 않고 클립되도록 설정
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.end,
                children: [
                  Icon(Icons.favorite_border),
                  Text("4")
                ],
              )
            ],
          ),
        ),
      ],
    );
  }
}

chrome으로 설정한 후 실행하면 미리 보기 가능