여러분 안녕하세요.

조이코딩연구소 장샘 입니다.

 

어제 리스트뷰에 이어서 스낵바를 만들도록 하겠습니다.

스낵바는 뭘까요? 

 

음식..먹는게 아니라. 

 

앱 화면의 아래의 잠시 뜨는 팝업 창 같은거에요.

 

Flutter2.0으로 오면서 Snackbar 사용하는 방법이 바뀌었으니 잘 보도록 하시죠

 

자 먼저 리스트 뷰에 리스트 타일을 이용하여 하단 메뉴를 더 구성 하도록 하겠습니다.

각 하단별 메뉴를 추가 하였고, 클릭 하였을때 OnTap으로 효과를 주었습니다.

 

그리고 다음으로 스낵바를 나오도록 버튼을 추가하고 클릭 해보겠습니다.

import 'package:flutter/material.dart';

 

void main() => runApp(MyApp());

 

class MyApp extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return MaterialApp(

      title: 'Appbar',

      theme: ThemeData(

        primarySwatch: Colors.blue,

      ),

      home: MyPage(),

    );

  }

}

 

class MyPage extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return Scaffold(

      // 흰 도화지를 꺼내자.

      appBar: AppBar(

        // App Bar를 만들자

        title: Text('Joy Coidng Lab Menu'), // 앱 바에 글씨를 써준다.

        centerTitle: true// 가운데로 글씨를 정렬하자.

        elevation: 0.0//올록이 효과를 없앤다.

        actions: [

          //앱 바에 아이콘 들을 배치하자.

          IconButton(

            // 아이콘 버튼 형태를 만들자.

            icon: Icon(Icons.shopping_cart), //아이콘 쇼핑 카트 아이콘을 넣어보자.

            onPressed: () {

              // 버튼 클릭했을때의 번쩍효과!!

              print('menu button is clicked');

            },

          ), //리딩 속성을 불러 옵니다.

          IconButton(

            icon: Icon(Icons.search),

            onPressed: () {

              print('menu button is clicked');

            },

          ), //리딩 속성을 불러 옵니다.

        ],

      ),

      drawer: Drawer(

        //왼족 햄버거 모양의 메뉴를 만들어보자.

        child: ListView(

          //클릭했을때 리스트 메뉴를 만들자.

          padding: EdgeInsets.zero, //빈공간을 만들지 말자.

          children: [

            UserAccountsDrawerHeader(

              //메뉴 중에 사용자 헤드 메세지 부분을 만들자.

              currentAccountPicture: CircleAvatar(

                // 이미지는 동그랗게 꾸며주고.

                backgroundImage: AssetImage('assets/bonobono.jpg'), //내가 이미지 삽입

                backgroundColor: Colors.white, // 배경은 화이트로~

              ),

              otherAccountsPictures: [

                CircleAvatar(

                  backgroundImage: AssetImage('assets/User.jpg'),

                  backgroundColor: Colors.white,

                ),

                // CircleAvatar(

                //   backgroundImage: AssetImage('assets/bonobono.jpg'),

                //   backgroundColor: Colors.white,

                // ),

              ],

              accountName: Text('JoyCoding'), //사용자 계정에는 이부분을 꼭 써줘야 한다.

              accountEmail:

                  Text('jhwjhw2580@gmail.com'), //사용자 계정에는 이부분을 꼭 써줘야 한다.

              onDetailsPressed: () {

                //리스트 뷰 화면에서 화살표 모양의 오른쪽에 버튼 생성.

                print('arrow is clicked');

              },

              decoration: BoxDecoration(

                //사용자 계정 이미지를 동그랗게 꾸며준다.

                color: Colors.blue[200],

                borderRadius: BorderRadius.only(

                  //사각형 이미지의 아래쪽을 동그랗게 만든다.

                  bottomLeft:

                      Radius.circular(40.0), //40.0은 동그랗게 만들어 주는 상수 값이다. 변경 가능

                  bottomRight:

                      Radius.circular(40.0), //40.0은 동그랗게 만들어 주는 상수 값이다. 변경 가능

                ),

              ),

            ),

            ListTile(

              //왼쪽 끝에 아이콘 배치 하는것.

              leading: Icon(

                Icons.home,

                color: Colors.grey[850], //아이콘의 색을 찐하게 해주는 것.

              ),

              title: Text('Home'),

              onTap: () {

                //onTap은 두번 Touch하거나 쭈욱 눌렀을때 이벤트를 할 수 있는 것.

                print('Home is Clicked');

              },

              trailing: Icon(Icons.add), //오른쪽 끝에 배치하는 것 트레일링.

            ),

            ListTile(

              leading: Icon(

                //왼쪽 끝에 아이콘 배치 하는것.

                Icons.settings,

                color: Colors.grey[850],

              ),

              title: Text('Setting'),

              onTap: () {

                print('Setting is Clicked');

              },

              trailing: Icon(Icons.add), //오른쪽 끝에 배치하는 것 트레일링.

            ),

            ListTile(

              leading: Icon(

                //왼쪽 끝에 아이콘 배치 하는것.

                Icons.question_answer,

                color: Colors.grey[850],

              ),

              title: Text('Q&A'),

              onTap: () {

                print('Question is Clicked');

              },

              trailing: Icon(Icons.add), //오른쪽 끝에 배치하는 것 트레일링.

            ),

          ],

        ),

      ),

      body: Center(

        child: ElevatedButton(

          child: Text('Show Me'),

          onPressed: () {

            ScaffoldMessenger.of(context).showSnackBar(

              const SnackBar(

                content: Text('Flutter2.0 Snack method'),

              ),

            );//<-- 여기가!!! 세미 콜론이야!!!!! 온프레스드!!!!

          },

        ),

      ),

    );

  }

}

 

자 조금씩 플러터 위젯을 공부하고 있습니다.

서서히 앱의 형태가 나타나기 시작하고 있죠? 이렇게 조금씩이라도 공부해서 하나씩 여러분걸로 만든다면

나중에 완전한 앱을 플러터로 만들 수 있겠죠?

 

그럼 오늘도 이만.. 조이코딩연구소 장샘 2021.04.24 오후 11시43분...

이미지를 추가하기 위하여 일단 왼쪽 종이 모양 아이콘을 누르고

새로운 폴더를 만들어 줍니다.

마우스 오른쪽 버튼을 새로운 폴더 만들기가 있어요

저는 assets라고 폴더를 생성 해봅니다.

폴더를 만드신 뒤 원하는 이미지를 드래그를 하여 assets폴더에 바로 이동 시킵니다. 

그다음에 왼쪽 파일리스트 중 pubspec.yaml 파일로 가봅니다.

그러면 # 주석 처리처럼 활성화가 안되어 있을 겁니다.

이부분을 마우스로 범위를 지정한뒤 ctrl + / 누르면 자동적으로 활성화가 됩니다.

 # assets:
  #   - images/a_dot_burr.jpeg
  #   - images/a_dot_ham.jpeg

아래처럼 변합니다. 뿅!!!

그다음에 내가 실제로 불러온 이미지 이름으로 수정해줘야 합니다.

 

흠.. png 파일은 오류가 발생하네요...

다시 jpg 파일을 다운받아서 했습니다.

이미지를 각 영역에 넣어주고 효과를 주면.

자 그리고 플러터 앱에서 실행했을 때 플러터 앱 위에 debug 띠를 없애는 방법은

플러터 앱을 실행하면 처음 시작 호출되는 위젯 home이 있는 곳에서

      debugShowCheckedModeBanner: false,

로 해주면 사라진것을 알 수 있다.

 

자 오늘의 정리 들어 갑니다.

1. 플러터 앱 이미지 넣는 방법 
 1) 폴더를 만들어 준다. jpg파일 형태로.. 다른건 왜 안되는지 모르겠네요.
 2) pubspec.yaml에 가서 이미지를 등록시킬 수 있도록 활성화를 시켜준다. 
    활성화 시켜주는 방법은 마우스로 영역을 설정 후에 Ctrl + / 를 누르면 활성화가 된다.
   예)    assets:
    - assets/123.jpg
    - assets/456.jpg

이후에 Ctrl + s를 눌러서 컴파일해보고 오류가 안뜬다면 정상적으로 등록 완료.

3) 이미지를 동그랗게 불러올 수 있는 플러터의 막강한 위젯 기능

CircleAvatar(서클 아바타!!!)를 활용하고

  backgroundImage: AssetImage('assets/456.jpg')를 이용하여 이미지를 넣어준다.
  radius: 60.0,(이미지의 사이즈를 설정해준다.)

4) 플러터 선을 그리는 위젯( 이미지와 이미지 사이의 선을 만들어 주는 위젯 )

   - Divider 이다.

예)    Divider
       height: 60.0
       //Divider의 높이를 말하는게 아니라 위와 아래의 위젯의 거리를 표현하는 것이다. 60이면 위30, 아래로 30이다.

       color: Colors.grey[850],  
      thickness: 0.5//두께
      endIndent: 30.0//끝에서 부터 어느정도 떨어질것인지 설정하는 것.
 ),

2. 플러터 아이콘 위젯을 이용하여 구현 하자.

플러터 위젯의 Icon은 다양한 형태의 아이콘 위젯을 제공한다. Ctrl + Space를 누르면 항목들이 나온다. 또는 Ctrl 누르고 마우스를 Icon을 클릭하면 나오니 참고 하도록 하자.

 Icon(Icons.check_circle_outline),

 

 자 지금까지 3번의 걸쳐서 정적인 앱에서 이미지와 텍스트를 이용하여 하나의 플러터 앱 페이지를 만들어 보았습니다.

우리가 한것은 이렇습니다.

앱 페이지의 상단 AppBar에 색을 넣고 글씨를 넣었고

앱 페이지의 메인 Body에 색을 넣고 이미지를 넣고 정렬하고, 글씨를 넣고 정렬하고, 아이콘 위젯을 이용하여 삽입 정렬.

이것이 다다...

너무 많은 것을 공부하고 많은 코딩을 하였는데 허무 한가..

이게 시작이고 이게 반이라고 생각한다.

다양한 알고리즘을 적용하는건 찾아서 적용하고, 기본적인 레이아웃과 정렬, 이미지, 텍스트, 아이콘을 사용했다라는거에

어느정도 자부심을 가져보도록 하자. 

그러면 이만 조이코딩연구소 장샘 2021.04.20 오후 9시8분...

1. Flutter 프로젝트 폴더 구성하기

2. 코드의 기본 내용을 알아보자

3. 앱 페이지 기본 구성 공식을 외워보기

4. Flutter 앱 실행을 해보기.

pubspec.yaml

앱을 만들때 버전 환경등 다양한 셋팅을 하는 곳이다.

android 폴더와 ios 폴더는 앱을 배포할때 정보를 갖고 있다고 생각하면 된다.

가장 중요한건 lib 폴더 입니다. 라이브러리 폴더라고도 부를 수 있고요.

앱을 만들때 여기서 거의 대부분의 작업을 진행 할겁니다.

자 우리는 main.dart의 있는 기본 소스 내용을 지우고 시작을 해보도록 하겠습니다.

플러터 머트리얼을 임폴트 해줘야 된다.

이것은 플러터의 위젯이랑 각종 기능들을 사용하기 위해서 무조건 입력을 해줘야 합니다.

import 'package:flutter/material.dart';

void main() => runApp(Myapp())

=> 함수를 호출해오는 것이다.

플러터의 최상위 함수는 runApp 이 호출 될때 위젯=아규먼트 를 들어와야 된다.

Myapp이라는 위젯(우리가 직접 만들어야 되는 위젯)을 불러온다.

클래스와 함수명

main(), runApp() -> 함수

첫글자를 소문자 넣는다 대부분 함수는.

클래스는 대부분 문자로 한다.

서로 결합한것을 앞에는 대문자. 카멜

MyApp() -> 위젯 

이 MyApp 위젯은 처음에 앱을 구동할때 뼈대를 만드는 역활만을 할것입니다. 정적인 위젯입니다.

정적인 의미의 StatelessWidget 를 만들어 줬고, MyApp이라는 우리만의 커스텀 클래스를 만들었습니다.

MyApp은 Container라는 것을 나를 호출한것에 넘겨주게 되는데 이것을 바꿔보도록 합시다.

우리가 필요한건 앱을 만들기 위한 머트리얼 기능을 가진 위젯입니다 이것을 가져 옵시다.

class MyApp extends StatelessWidget {

  @override

  Widget build(BuildContext context) {

    return Container( ------>>return MaterialApp

    );

  }

}

MaterialApp 위젯도 반드시 아규먼트를 가져야만 합니다.

플로터의 모든 위젯들은 아규먼트를 가진다고 생각하면 됩니다.

앱을 총징하는 앱의 타이틀을 만들어 보도록 합니다.

MaterialApp은 타이틀이라는 문자열을 아규먼트로 가지고 있습니다.

 

 

ctrl + s 저장하고 바로 에뮬레이터 나올 수 있다.

 

오늘도 여기까지.. 서서히 머리가 아파 오는것 같지만

어색함이 익숙함이 될때까지 반복과 노력만 있을 뿐.

2021.04.19 오후 9시50분! 조이코딩연구소 장샘.

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts