[Flutter] 레이아웃 위젯

2023. 9. 12. 10:41·Web & Android/Flutter

레이아웃 위젯

상중하 위젯 : Scaffold()

MaterialApp(
  home: Scaffold(
    appBar: 상단에 넣을 위젯,
    body: 중단에 넣을 위젯,
    bottomNavigationBar: 하단에 넣을 위젯,
  )
);
  • appBar : 상단
    • 자주 쓰는 파라미터
      • title: 왼쪽 제목 - appBar: AppBar(title: Text(**'앱임'**))
      • leading: 왼쪽에 넣은 아이콘 - appBar: AppBar(leading: Icon(Icons.star))
      • title과 leading 같이 사용 가능
      • actions: [] - 우측아이콘들 - appBar: AppBar(actions: [Icon(Icons.star), Icon(Icon.star)]
AppBar(
  title : Text('앱제목'),
  leading : Icon(Icons.star),
  actions : [ Icon(Icons.star), Icon(Icons.star) ]
)
  • body : 중간
  • bottomNavigationBar : 하단
MaterialApp(
  home: Scaffold(
    appBar: AppBar( title: Text('앱제목') ), 
    body: Text('안녕'), 
    bottomNavigationBar: BottomAppBar( child: Text('하단바임 ㅅㄱ') ),
  )
);

여러 위젯 가로로 배치하는 법

  • Row( children: [ ] )
MaterialApp(
  home: Scaffold(
    body: Row( 
      children: [ Icon(Icons.star), Icon(Icons.star), Icon(Icons.star) ] 
    ), 
  )
);

여러 위젯 세로로 배치하는 법

  • Column( children: [ ] )
MaterialApp(
  home: Scaffold(
    body: Column( 
      children: [ Icon(Icons.star), Icon(Icons.star), Icon(Icons.star) ] 
    ), 
  )
);

가로로 배치하는 간격 조절

  • mainAxisAlignment → 가로 정렬
    • spaceEvenly → 모든 여백 동일
    • .spaceBetween → 좌우 끝에 우선 배치
    • .spaceAround → 모든 여백 동일인데 좌우 마지막 여백은 절반만큼
    • .start → 시작 부분에 다 모여
    • .end → 끝 부분에 다 모여
    • .center → 중간에 다 모여
MaterialApp(
  home: Scaffold(
    body: Column( 
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      children: [ Icon(Icons.star), Icon(Icons.star), Icon(Icons.star) ] 
    ), 
  )
);

세로로 배치하는 간격 조절

  • crossAxisAlignment → 세로 정렬
body: Container (
  color: Colors.grey,
  height : 400,  //높이 넣어야 세로정렬 가능할듯 
  child : Row (
    crossAxisAlignment: CrossAxisAlignment.start,
    children: const [
      Icon(Icons.star),
      Icon(Icons.star),
      Icon(Icons.star),
    ],
  ),
),

예제

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(title: Text('앱임')),
          body: Text('안녕'),
          bottomNavigationBar: BottomAppBar(
            child: SizedBox(
              height: 70,
              child: Row(
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  Icon(Icons.phone),
                  Icon(Icons.message),
                  Icon(Icons.contact_page)
                ]
              ),
            ),),
        )
    );
  }
}

Flexible 위젯

  • Row() 안에 박스를 여러 개 배치할 때 박스의 폭을 고정된 숫자가 아니라 %로 지정해주고 싶을 때 쓰는 것
    • flex → 이 박스가 얼마나 가로폭을 차지할지 결정하는 "배수"이다.
      • 1과 2를 써놓으면 1대 2만큼 차지
      • 1과 1을 써놓으면 1대 1만큼 차지
Row(
  children : [
    Flexible( child: Container(color : Colors.blue), flex : 1 ),
    Flexible( child: Container(Color : Colors.green), flex : 1 )
  ]
)

Expanded 위젯

  • 하나의 박스만 가로폭을 꽉 채우고 싶으면
    Row(
      children : [
        Expanded( child: Container(color : Colors.blue), flex : 1 ),
        Container(Color : Colors.green, width : 100),
      ]
    )

예제

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(title: Text('금호동3가'), actions: [Icon(Icons.search), Icon(Icons.add_alert)],),
          body: Container (
            height: 150,
            padding: EdgeInsets.fromLTRB(5, 10, 10, 10),
            child: Row(
              children: [
            Flexible(child: Image.asset('assets/dog.png', width: 150), flex: 3,),
                Flexible(flex: 7,child: Container(
                  child: Column (
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text('캐논 DSLR 100D (단렌즈, 충전기 16기가SD 포함)', style: TextStyle(fontSize: 18),),
                      Text('성동구 행당동 끌올 10분 전', style: TextStyle(color: Colors.grey, fontSize: 15),),
                      Text('210,000원', style: TextStyle(fontSize: 16),),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.end,
                        children: [
                          Icon(Icons.favorite),
                          Text('4')
                        ],
                      )
                    ],
                  ),
                ),
                )
              ],
            )
          )
        )
    );
  }
}

커스텀 위젯

💡 레이아웃 위젯이 너무 길 때 커스텀 위젯을 사용하면 됨

만드는 방법

  • stless 작성 후 탭 키 누르면 커스텀 위젯을 작성할 수 있는 코드가 생성됨
class 클래스명 extends StatelessWidget {
  const ({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return 작성할 코드;
  }
}
  • ex → 긴 코드를 제거한 후 새로 만든 클래스에 삽입하고 함수명을 작성해주면 됨
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(title: Text('금호동3가'), actions: [Icon(Icons.search), Icon(Icons.add_alert)],),
          body: ShopItem()
        )
    );
  }
}

class ShopItem extends StatelessWidget {
  const ShopItem({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SizedBox(
      child: Text('안녕'),
    );
  }
}
  • 변수에 담아서 사용해도 됨
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(title: Text('금호동3가'), actions: [Icon(Icons.search), Icon(Icons.add_alert)],),
          body: a
        )
    );
  }
}

var a = SizedBox(
  child: Text('안녕'),
);

ListView 위젯

장점

  • 무한스크롤됨
  • 데이터만 있으면 자동으로 반복문 돌려줌
  • 지나간 목록은 삭제해서 메모리 아낄 수 있음
ListView(
  children: [
    Text('안녕'),
    Text('안녕'),
    Text('안녕'),
  ],
)

예제

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
          appBar: AppBar(),
          body: ListView(
            children: [
              ListTile(
                leading: Icon(Icons.account_circle_rounded),
                title: Text('홍길동'),
              ),
              ListTile(
                leading: Icon(Icons.account_circle_rounded),
                title: Text('홍길동'),
              ),
              ListTile(
                leading: Icon(Icons.account_circle_rounded),
                title: Text('홍길동'),
              )
            ],
          ),
          bottomNavigationBar: BottomBar()
        )
    );
  }
}

class BottomBar extends StatelessWidget {
  const BottomBar({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return BottomAppBar(
      height: 70,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          Icon(Icons.phone),
          Icon(Icons.message),
          Icon(Icons.contact_page)
        ],
      ),
    );
  }
}

 

ListView.builder() → 자동 반복 함수

MaterialApp(
        home: Scaffold(
          appBar: AppBar(),
          body: ListView.builder(
              itemCount: 반복 횟수,
              itemBuilder: (c, i) {
                return 반복할 함수
              },
            )
        )
    );
MaterialApp(
        home: Scaffold(
          appBar: AppBar(),
          body: ListView.builder(
              itemCount: 3,
              itemBuilder: (c, i) {
                return ListTile(
                  leading: Icon(Icons.account_circle_rounded),
                  title: Text('홍길동'),
                );
              },
            )
        )
    );

저작자표시 비영리 변경금지 (새창열림)

'Web & Android > Flutter' 카테고리의 다른 글

[Flutter] 권한 팝업 요청 기능  (0) 2023.09.12
[Flutter] 버튼에 기능 부여하는 법  (0) 2023.09.12
[Flutter] Lint 관련 워닝 무시하는 법  (0) 2023.09.12
[Flutter] 위젯(글자, 아이콘, 네모박스, 버튼)  (1) 2023.09.07
[Flutter] 안드로이드 스튜디오 Dart / Flutter 플러그인 설치  (0) 2023.09.06
'Web & Android/Flutter' 카테고리의 다른 글
  • [Flutter] 권한 팝업 요청 기능
  • [Flutter] 버튼에 기능 부여하는 법
  • [Flutter] Lint 관련 워닝 무시하는 법
  • [Flutter] 위젯(글자, 아이콘, 네모박스, 버튼)
woojin._.
woojin._.
여러가지 개발을 해보며 발생하는 이야기들에 대한 블로그입니다:)
  • woojin._.
    Jin's Dev Story
    woojin._.
  • 전체
    오늘
    어제
    • 분류 전체보기 (829)
      • Tools (25)
        • eGovFrame (3)
        • GeoServer (3)
        • QGIS (2)
        • LabelImg (2)
        • Git (6)
        • GitHub (1)
        • Eclipse (7)
        • Visual Studio (1)
      • Web & Android (121)
        • SpringBoot (37)
        • Three.js (2)
        • Spring Data JPA (9)
        • 스프링 부트 쇼핑몰 프로젝트 with JPA (25)
        • Thymeleaf (4)
        • Spring Security (15)
        • Flutter (29)
      • Programming Language (61)
        • JAVA (27)
        • JavaScript (14)
        • Dart (2)
        • Python (15)
        • PHP (3)
      • Database (43)
        • PostgreSQL (32)
        • MYSQL (7)
        • Oracle (3)
        • MSSQL (1)
      • SERVER (17)
        • TCP_IP (3)
        • 리눅스 (7)
        • AWS (7)
      • Coding Test (445)
        • 백준[JAVA] (108)
        • 프로그래머스[JAVA] (260)
        • 알고리즘 고득점 Kit[JAVA] (3)
        • SQL 고득점 Kit[ORACLE] (74)
      • CS 지식 (49)
        • [자료구조] (14)
        • [네트워크] (12)
        • [데이터베이스] (10)
        • [알고리즘] (9)
        • [운영체제] (4)
      • 기타 (6)
      • 자격증 & 공부 (62)
        • 정보처리기사 (2)
        • SQLD (6)
        • 네트워크관리사 2급 (5)
        • 리눅스마스터 1급 (44)
        • 리눅스마스터 2급 (1)
        • ISTQB (3)
        • 시스템보안 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 태그

    CS
    CS지식
    pcce 기출문제
    python
    Spring Security
    baekjoon
    백준
    springboot
    Linux
    스프링부트
    Flutter
    자바
    리눅스마스터
    JPA
    리눅스
    postgresql
    programmers
    backjoon
    spring
    데이터
    시큐리티
    Java
    프로그래머스
    스프링 부트 쇼핑몰 프로젝트 with JPA
    데이터베이스
    DB
    리눅스마스터 1급
    스프링
    플러터
    Oracle
  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
woojin._.
[Flutter] 레이아웃 위젯
상단으로

티스토리툴바