Center

더보기
import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("플러터 마스터"),
      ),
      body: Center(
        child: Container(
          color: Colors.red,
          width: 100,
          height: 100,
        ),
      ),

    );

  }
}

 


Padding

  • 안쪽 여백을 설정
  • EdgeInsets 클래스를 사용하여 설정 
    (앞에 const를 붙여 컴파일 타임 상수로 설정할 경우 -> 다시 사용될 경우 메모리에 있는 값을 재사용하는 장점이 있다.)
  • EdgeInsets.all() -> 4방향 모두를 설정함
  • EdgeInsets.only() -> 상하좌우 중에서 원하는 방향에만 값을 지정한다. (지정하지 않을 경우 기본 값 0.0)
  • EdgeIsets.FromLTRB() -> 4 방향의 값을 각각 지정

 


Align

  • 자식위젯의 정렬 방향을 정함

import 'dart:math';

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("플러터 마스터"),
      ),
      body: Align(
        alignment: Alignment.bottomRight,
        child: Container(
          color: Colors.red,
          width: 100,
          height: 100,
        ),
      ),

    );

  }
}

 


Expanded

  • 자식 위젯의 크기를 -> 최대로 학장시켜 줌
  • 여러 위젯에 동시에 적용할 경우 ->  flex 프로퍼티에 정숫값을 지정하여 비율을 지정할 수 있음 (기본값은 1)

import 'dart:math';

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("플러터 마스터"),
      ),


      // 여기서부터 수정!!!!!
      body: Column(
        children: <Widget>[
          Expanded(
            flex: 3,
              child: Container(
                color: Colors.red,
              ),
          ),
          Expanded(
            flex: 2,
              child: Container(
                color: Colors.yellow,
              ),
          ),
          Expanded(
              flex: 1,
                child: Container(
                  color: Colors.blue,
                ),
          ),
        ],
      )

    );

  }
}

3:2:1 비율

 

 


SizedBox

  • 크기에 관련한 프로퍼티가 없는 위젯을 특정 크기로 만들고 싶을 때 사용

import 'dart:math';

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("플러터 마스터"),
      ),
      
      // 여기서부터 수정!!!!!
      body: SizedBox(
        width: 100,
        height: 100,
        child: Container(
          color: Colors.red,
        ),
      ),

    );

  }
}

 

 


Card

  • 기본적으로 크기가 0이므로 -> 자식 위젯에 따라 크기가 결정된다.
  • elevation -> 그림자의 깊이 조절 가능
  • shape ->  카드 모양을 변경 
import 'dart:math';

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("플러터 마스터"),
      ),

      // 여기서부터 수정!!!!!
      body: Center(
        child: Card(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(16.0),
          ),
          elevation: 7.0,
          child: Container(
            width: 100,
            height: 100,
            color: Colors.yellow,
          ),
        ),
      ),

    );

  }
}

 

ListView,  ListTitle

  • ListView -> 리스트를 표시하는 위젯 (리스트 표현에 최적화 됨)
  • ListTitle ->  leading(왼쪽),  title(중앙), tailing 오른쪽  위치를 담당
                         onTap : 터치 했을 때 실행하는 동작을 정의하는 함수
import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HaHa~~'),
      ),

      // 보통 여기서 부터 수정!!!~
      body: ListView(
        scrollDirection: Axis.vertical,
        children: <Widget>[
          ListTile(
            leading: Icon(Icons.home),
            title: Text("Home"),
            trailing: Icon(Icons.navigate_next),
            onTap: () {},
          ),
          ListTile(
            leading: Icon(Icons.event),
            title: Text("Event"),
            trailing: Icon(Icons.navigate_next),
            onTap: (){},
          ),
          ListTile(
            leading: Icon(Icons.event),
            title: Text("Camera"),
            trailing: Icon(Icons.navigate_next),
            onTap: (){},
          ),
        ],

      ),
    );

  }
}


GridView

  • 열 수를 지정하여 그리드 형태로 표시
  • GridView.count() 생성자는 -> 그리드를 작성하게 함
  • crossAxisCount 프로퍼티에 -> 열의 수를 지정함

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HaHa~~'),
      ),

      // 보통 여기서 부터 수정!!!~
      body: GridView.count(
          crossAxisCount: 2, // 열의 수 지정
        children: <Widget>[
          Container(
            color: Colors.red,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
          Container(
            color: Colors.green,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
          Container(
            color: Colors.blue,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),

        ],
      ),
    );

  }
}

 


PageView

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('HaHa~~'),
      ),

      // 보통 여기서 부터 수정!!!~
      body: PageView(
        children: <Widget>[
          Container(
            color: Colors.green,
          ),
          Container(
            color: Colors.red,
          ),
          Container(
            color: Colors.blue,
          ),
        ],
      ),
    );

  }
}

 


AppBar, TabBar,  Tab, TabBarView

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return DefaultTabController( // Scaffold를 감싸야 한다.
        length: 3, // 탭 수 지정
        child: Scaffold(
          appBar: AppBar(
            title: Text('Tab'),
            bottom: TabBar(  // Scaffold의  bottom 프로퍼티에 TabBar 지정함
              tabs: <Widget>[  // tab 리스트 지정
                Tab(icon: Icon(Icons.tag_faces)),
                Tab(text: "메뉴2"),
                Tab(icon: Icon(Icons.info), text: "메뉴3"),
              ],
            ),
          ),
          body: TabBarView(
            children: <Widget>[
              Container(color: Colors.yellow,),
              Container(color: Colors.orange,),
              Container(color: Colors.red,),
            ],
          )
        )
    );
  }
}

 


BottomNavigationBar

  • DefaultTabController 로 -> Scaffold를 감싸야 한다.
  • 하단에 2~5개의 탭 메뉴를 구성 할 수 있음
  • Scaffold 프로퍼티에 -> bottomNavigationBar 프로퍼티를 정의 -> 
    Items 프로퍼티에 -> BottomNavigationBarItem 위젯들을 나열 함
import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context) {
    return DefaultTabController( // Scaffold를 감싸야 한다.
        length: 3, // 탭 수 지정
        child: Scaffold(
          bottomNavigationBar: BottomNavigationBar(items: [
            BottomNavigationBarItem(
                icon: Icon(Icons.home),
                label: "Home",
            ),
            BottomNavigationBarItem(
                icon: Icon(Icons.person),
                label: "Profile",
            ),
            BottomNavigationBarItem(
                icon: Icon(Icons.notifications),
                label: "Notification"
            ),
          ],),
        )
    );

  }
}

 

Container

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('제목'),
      ),

	// 여기서부터 주로 수정함!!!
      body: new Container(
        color: Colors.red,
        width: 100,
        height: 100,
        padding: const EdgeInsets.all(8.0),
        margin: const EdgeInsets.all(8.0),
      ),
    );

  }
}


 

Column

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('제목'),
      ),
      
      // 보통 여기서 부터 수정!!!~
      body: Column(
        children: <Widget>[
          Container(
            color: Colors.red,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
          Container(
            color: Colors.green,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
          Container(
            color: Colors.blue,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
        ],
      ),
    );

  }
}


Row

mainAxis,  crossAxis

 

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Column~~'),
      ),

      // 보통 여기서 부터 수정!!!~
      body: Row(
        mainAxisSize: MainAxisSize.max,  // 가로로 꽉 채우기
        mainAxisAlignment: MainAxisAlignment.center,  // 가로 방향으로 가운데 정렬
        crossAxisAlignment: CrossAxisAlignment.center,
        children: <Widget>[
          Container(
            color: Colors.red,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
          Container(
            color: Colors.green,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
          Container(
            color: Colors.blue,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
        ],
      ),
    );

  }
}


Stack

  • children에 나열한 위젯을 순서대로 겹치게 한다.
    (먼저 작성한 위젯이 아래쪽  ->  나중에 작성한 위젯이 위쪽)
import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Column~~'),
      ),

      // 보통 여기서 부터 수정!!!~
      body: Stack(
        children: <Widget>[
          Container(
            color: Colors.red,
            width: 100,
            height: 100,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
          Container(
            color: Colors.green,
            width: 80,
            height: 80,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
          Container(
            color: Colors.blue,
            width: 60,
            height: 60,
            padding: const EdgeInsets.all(8.0),
            margin: const EdgeInsets.all(8.0),
          ),
        ],
      ),
    );

  }
}


 

SingleChildScrollView

  • column 및 ListBody를 사용하여 위젯이 넘어갈 경우 스크롤을 이용
  • column은 -> 표시할 위젯의 크기만큼 가로길이를 가짐
  • ListBody -> 스크롤 가능 영역이 가로로 꽉 차서 스크롤하기 더 쉬움
import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {

  // 0 ~ 99 까지의 값을 갖는 리스트 생성
  final items = List.generate(100, (i) => i).toList();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Stack~~'),
      ),

      // 보통 여기서 부터 수정!!!~
      body: SingleChildScrollView(
        child: ListBody(
          children: items.map((i) => Text("$i")).toList(),
        ),
      ),
    );

  }
}

 


 

 

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스,
// ignore: must_be_immutable
class MyHomePage extends StatefulWidget{

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>{
  var _text = "hello";

  @override
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text("Hi world!"),
      ),
      body: Text(
        _text,
        style: TextStyle(fontSize: 40),
      ),

      floatingActionButton: FloatingActionButton(
        onPressed: (){
          setState(() { // _text를 변경하고 setState()로 화면을 갱신함
            _text = "World";
          });
        },
        child: Icon(Icons.touch_app),
      ),
    );
  }
}


 

 

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스, 
// ignore: must_be_immutable
class MyHomePage extends StatelessWidget {


  @override
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text("Hello World"),
        ),
      body: Text("Hello World", style: TextStyle(fontSize: 40),),
    );
  }
}


 

import 'package:flutter/material.dart';


// 앱 시작 부분
void main() {
  runApp(MyApp());
}


// 시작 클랙스, 머티리얼 디자인 앱 생성!
class MyApp extends StatelessWidget {
  // StatelessWidget 클래스는 상태를 가지지 않는 위젯을 구성하는 기본 클래스.
  // (상태를 가지지 않는 다는 것은-> 한 번 그려진 후 다시 그리지 않는 경우이며,
  // 프로퍼티로 변수를 가지지 않는다 다만 상수는 가질 수 있다.)

  // StatelessWidget 은 build() 메서드를 가지고 있고 이 메서드는 위젯을 생성할 때 호출 되면서 화면에 그릴 위젯을
  // 반환한다.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // title, theme, home 인수를 설정한다. (위젯의 속성을 표현)
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      //                ↱이름있는 인수이다.(클래스의 프로퍼티에 값을 할당하는 것임)
      home: MyHomePage(title: 'Flutter Demo Home Page'), // 표시할 화면의 인스턴스 (실제 앱에 표시하는 위젯)
    //  ↳ MyHomePage()인스턴스를 생상하고 -> MyHomePage 의 this.title 인수에 값을 전달
    );
  }
}

// 시작 클래스가 실제로 표시하는 클래스, 카운터 앱 화면이다. (상태를 가질 수 있고 상태는 State의 서브클래스로 정의한다)
// ignore: must_be_immutable
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}): super(key: key);
  //          ↳key, title 프로퍼티를 받아서 -> super 키워드로 부모 클래스 생성자에 key를 전달,
  //                                           this.title은 final String title에 대입 된다.


  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
//  ↳ MyHomePage클래스가 상속받은 StatefulWidget클래스의 createStae() 메서드를 재정의 해서-> _MyHomePageState클래스의 인스턴스로 반환
//  ↳ StatefulWidget이 생성할 때 한번만 실행됨
}


// ### 상태 클래스 ###
// 위 MyHomePage 클래스의 상태를 나타내는 state 클래스, (변경 가능한 상태 프로퍼티 변수로 표현함)
class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;  // 화면시 표시할 상태값인 카운터 숫자


  // 입력 인수와 반환 값이 없는 익명 함수로 _counter를 1씩 증가시킴
  void _incrementCounter() {

    // ↱화면을 다시 그리도록하는 함수, (즉 위의 익명함수를 실행 후 build()메서드를 다시 실행시켜 ->화면을 다시 그리도록 함)
    //  (StatefulWidget만 가능)
    setState(() {
      _counter++;
    });
  }


  // 화면에 UI를 그리는 메서드, 그려질 위젯을 반환
  @override
  Widget build(BuildContext context) {
    // _MyHomePageState 클래스의 상태에 따라 -> 화면에 그려질 코드를 작성함↴

    return Scaffold(  //머티리얼 디자인 기본 뼈대 위젯
      appBar: AppBar( //상단 앱바  (appBar에 AppBar 클래스의 인스턴스를 전달)

        // title에 Text위젯을 정의(글자를 나타내는 위젯), widget.title을 받아서 보여줌
        title: Text(widget.title),
      //             ↳ StatefulWidget 클래스에 접근하기 위해 widget 프로퍼티를 사용
      ),

      body: Center( // 표시할 내용
        // Center is a layout widget. It takes a single child and positions it
        // in the middle of the parent.
        child: Column(

          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times~:',
            ),
            Text(
              '$_counter',  // _counter 변수를 표시 (정수이므로 $를 붙여서 문자열로 변환)
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter, // 클릭시 _incrementCounter() 메서드 실행
        tooltip: 'Increment', // 사용자가 화면을 길게 터치할 경우 표시할 글자를 지정
        child: Icon(Icons.add), // 아이콘 그림을 표시함
      ),// This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

 

 

안드로이드 스튜디오 설치하기

https://developer.android.com/studio

 

Download Android Studio and SDK tools  |  Android 스튜디오

developer.android.com

 

플러터 SDK 다운받기

https://flutter-ko.dev/docs/get-started/install/macos#update-your-path

 

맥OS에서 설치

 

flutter-ko.dev

  • 내가 원하는 폴더에 저장한 후 압축 풀기 (저는 /Users/wan/Dev 에 풀었음)
  • 환경설정 추가하기 z쉘을 사용하고 있으므로  터미널에 vim ~/.zshrc 입력하기
    vim 수정 창에서 아래 그림처럼 입력하기

  • 저장하고 나와서 아래 코드 입력해서 새로고침해주기
 source .zshrc

 

  • 플러터 설치 잘 되어 있는지 위치 확인해보기

 

  • flutter doctor를 이용해 설치 잘 되었는지 확인하기

 

  • 안드로이드 스튜디오 라이센스 등록

 


에러발생한 경우 Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema

더보기

안드로이드 스튜디오에서 Preferences (설정) 가기 -> System Setting -> Android SDK -> SDK Tools ->
-> 아래처럼 체크하고 ok하기 ->

 ->그리고 터미널로 가서 flutter doctor --android-licenses 다시하기

 

 


  • xcode 라이센스

 

'Flutter' 카테고리의 다른 글

플러터란?  (0) 2021.06.11

기본개념

  • 플러터는 크게 프레임워크, 엔진, 임베더 계층으로 구성되어 있다.
    - 프레임워크 계층 -> 다트 언어로 개발된 여러 가지 클래스가 있으며 이러한 클래스를 이용해 앱을 개발
    - 엔진 계층 -> 플러터의 코어를 담당하는데 대부분  c와 c++ 언어로 만들어짐
                          (데이터 통신, 다트 컴파일, 렌더링, 시스템 이벤트 등을 처리)
    - 임베더 계층 -> 플러터 앱이 크로스 플랫폼에서 동작하도록 플러터 엔진이 렌더링한 결과를
                              플랫폼별 네이티브 언어로 뷰를 만들어 화면에 보여줌
  • 안드로이드 앱 -> 자바, c, c++ 언어로 만들어 짐
  • ios 앱 -> 오브젝티브-c와 오브젝티브-c++ 언어로 만듦
  • 다트 언어로 소스파일만 작성하면 플러터의 각 계층을 거쳐 플랫폼별 앱을 개발 함

 

 

'Flutter' 카테고리의 다른 글

플러터 설치 및 개발환경  (0) 2021.06.12

+ Recent posts