반응형
반응형
반응형

이전 글에서 콜백 함수, 웹뷰 위젯에 대해서 알아보았다.

이를 이용하여 이제 웹 앱 만들기에 도전해보자.

이미 만들어진 웹 페이지를 앱에서 불러와서 보여주는 앱을 웹 앱이라 부른다.

웹 앱을 만들기 전에 사전 설정이 필요하다.

 

1. 플러그인 추가

 - pubspec.yaml

dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2

  # 웹뷰 플러그인 추가.
  webview_flutter: 3.0.4

위와 같이 웹뷰 플러그인을 추가하고 "pub get" 을 클릭하여 플러그인을 내려받는다.

"pub get" 버튼을 클릭하지 않고 플러그인을 내려받는 방법은...

아래처럼 안드로이드 스튜디오 하단의 "터미널" 탭에서 명령어를 실행하는 것이다.

- flutter pub get

 

2. 권한 및 네이티브 설정

 - 웹 앱을 만들기 위해 인터넷 사용 권한을 추가하고 http / https 프로토콜을 이용할 수 있게 설정해야 한다.

 - android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.flutter_sample">
....
   <uses-permission android:name="android.permission.INTERNET" />
....
</manifest>

 

 - 안드로이드 빌드 툴인 gradle 설정 파일인 build.gradle 은 모듈 파일로써 의존성이나 버전 정보를 관리한다.

 - android/app/build.gradle(android/build.gradle 파일은 프로젝트 파일이며 주로 클래스패스나 repository 정보등을 설정한다)

....

android {
    // 변경.
    // compileSdkVersion flutter.compileSdkVersion
    compileSdkVersion 32

....

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.example.flutter_sample"
        // You can update the following values to match your application needs.
        // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
        // 변경
        // minSdkVersion flutter.minSdkVersion
        minSdkVersion 20
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

....
}

....

 - minSdkVersion : 안드로이드 운영체제의 최소 SDK 버전을 설정

 - compileSdkVersion : 앱을 빌드할 때 사용할 SDK 버전. 앱은 compileSdkVersion 이하 버전의 기능을 모두 지원한다.

이런 네이티브 설정 관련 정보는 각 플러그인의 pub.dev 페이지에서 확인 할 수 있다.참고로 webview_flutter 플러그인 정보는 webview_flutter | Flutter Package (pub.dev) 에서 확인 할 수 있다.

아직 많은 사이트들이 https 가 아닌 http 만 지원하는 곳도 있을 수 있다. 따라서 http 프로토콜을 허용하도록 설정한다.

 - android/app/src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.flutter_sample">

   <uses-permission android:name="android.permission.INTERNET" />

   <application
        android:label="flutter_sample"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher"
        android:usesCleartextTraffic="true"> <!-- 여기 부분 추가 -->
        
       ....
       
</manifest>

 

다음 글에서 본격적으로 웹 앱을 만들어 보도록 하자!!

반응형
반응형

1. 콜백 함수

 - 일정 작업이 완료되면 실행되는 함수

 - 함수를 정의하고 바로 실행되는 것이 아니라 특정 조건이 됐을 때 실행되는 함수

 - ex) 사용자가 화면을 터치 했을 때 실행할 함수, 웹뷰의 로딩이 완료됐을 때 실행할 콜백 함수를 정의 할 수 있다.

WebView(
	initialUrl: 'https://childeye.tistroy.com',
    javascriptMode: JavascriptMode.unrestricted,
    
    onPageFinished: (String url) {
    	print(url);
    },
}

onPageFinished() 함수는 웹뷰에서 페이지 로딩이 완료된 뒤에 실행되는 콜백 함수이다.

첫 번째 매개변수로 로딩된 페이지의 url 전달한다.

페이지가 로딩 후 실행하고 싶은 작업이 있다면 함수 내부에 코드를 정의하면 된다.

WebView 위젯의 콜백함수는 onPageFinished 뿐 아니라 onWebViewCreated(), onPageStarted(), onProgress 등의 특정 조건이 성립됐을 때 실행되는 콜백 함수도 있다.

 

2. 웹뷰 위젯

웹뷰는 프레임워크에 내장된 브라우저를 앱의 네이티브 컴포넌트에 임베딩하는 기능이다.

엡에서 웹브라우저의 기능을 구현해 주는 것이다.

웹뷰는 네이티브 컴포넌트에 비해 속도가 느리고 애니메이션이 부자연스럽지만 기존에 만든 웹사이트를 손쉽게 활용할 수 있어서 사용한다.

이미 만들어진 웹사이트가 있다면 코드 몇 줄로 해당 사이트를 앱에서 웹뷰로 탑재해서 앱을 만들수 있다.

결제 모듈을 PG사에서 웹으로 이미 기능을 구현해두었기 때문에 웹뷰를 사용하면 결제 기능 개발을 별도로 구현할 필요가 없다.

 

웹뷰의 속성

 - initialUrl : 웹뷰에서 처음 실행할 웹사이트의 주소. 웹뷰가 포함된 위젯이 화면에 생성되면 웹뷰를 생성하고 initialUrl 사이트를 처음으로 실행한다.

 - javascriptMode : 웹뷰에서 자바스크립트 실행을 허용할지 여부를 결정.

   √ unrestricted : 자바스크립트를 제한 없이 실행

    disable : 자바스크립트를 실행 할 수 없음.

 - onWebViewCreated : 웹뷰 위젯이 생성되면 실행할 콜백 함수. 매개 변수로 WebViewController 를 전달하며 뒤로가기, 앞으로 가기, 새로운 URL 실행하기 등 기능을 조작할 수 있다.

 - onPageStarted : 웹뷰가 처음 생성되거나 페이지를 이동했을 때 웹페이지가 로딩되기 시작하면 실행할 콜백 함수. 매개변수로 로딩이 시작된 페이지의 URL 이 전달된다.

 - onPageFinished : 웹페이지 로딩이 끝나면 실행. 로딩이 완료된 웹페이지의 URL 이 매개변수로 전달된다.

 - onProgress : 웹페이지가 로딩 중일 때 지속적으로 실행되며 페이지의 로딩이 끝날 때까지 실행된다. 매개변수로 페이지 로딩 상태가 0 ~ 100 사이의 int 값으로 전달된다.

반응형
반응형

이전 글에 이어서 앱에 배경을 넣어보자!!

이제까지 홈 화면에 글자를 출력하는 앱을 만들었다.

여기에 배경색을 입혀보자!!

 

1. 배경색을 화면 전체에 오렌지색으로 적용.

import 'package:flutter/material.dart';

void main() {
  runApp(
    SplashScreen(),
  );
}

class SplashScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          decoration: BoxDecoration(
            color: Colors.orange,
          ),
          child: Center(
            child: Text('Splash Screen'),
          ),
        ),
      ),
    );
  }
}

BoxDecoration 은 배경색, 테두리 색상, 테두리 두깨 등 컨테이너의 여러가지 UI 요소를 지정할 수 있다.

결과

 

2. 글자 대신 이미지를 출력해보자

Text 위젯 대신 Image 위젯을 사용

 - 앱에 저장된 이미지를 사용

 - [프로젝트 디렉토리]/assets 디렉토리를 생성한다.

 - 로고로 사용할 이미지를 [프로젝트 디렉토리]/assets/logo.png 파일에 저장.

 - 이미지 파일을 사용할 수 있도록 [프로젝트 디렉토리]/pubspec.yaml 설정 파일에 내용을 추가한다.

flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  # assets:
  #   - images/a_dot_burr.jpeg
  #   - images/a_dot_ham.jpeg
  assets:
    - assets/

pubspec.yaml 파일을 변경 후에는 꼭 "Pub get" 을 하여 설정을 업데이트 한다.

 

글자 대신 이미지를 추가해보자.

import 'package:flutter/material.dart';

void main() {
  runApp(
    SplashScreen(),
  );
}

class SplashScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          decoration: BoxDecoration(
            color: Color(0xFFF99231),
          ),
          child: Center(
            child: Image.asset(
              'assets/logo.png'
            ),
          ),
        ),
      ),
    );
  }
}

글자 대신 로고 이미지가 나오는 걸 확인할 수 있다.

배경색도 로고 이미지와 동일한 색상인 0xFFF99231 로 변경하였다.

 

3. 위젯 정렬하기

 - 로딩 애니메이션 위젯을 로고 이미지 밑에 보이도록 해보자.

 - 세로로 정렬하기 위해 Column 위젯을 사용한다.

import 'package:flutter/material.dart';

void main() {
  runApp(
    SplashScreen(),
  );
}

class SplashScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          decoration: BoxDecoration(
            color: Color(0xFFF99231),
          ),
          child: Column(
            children: [
              Image.asset('assets/logo.png'),
              CircularProgressIndicator(),
            ],
          ),
        ),
      ),
    );
  }
}

Column 위젯의 children 매개변수에 로고 이미지와 로딩 애미메이션을 추가한다.

CircularProgressIndicator 은 플러터에서 제공하는 둥근 로딩 애미메이션 위젯이다.

 

Column 위젯의 mainAxisAlignment 매개 변수를 이용하여 children 위젯들의 배치할 수 있다.

 - 가운데 위치 시키기 : mainAxisAlignment: MainAxisAlignment.center

 

Column 위젯은 세로로 최대한 크기를 차지한다. 가로로는 최소한의 크기만 차지한다.

이미지 로고의 가로 크기를 조정하면 전체 화면이 달라진다.

 

이런 경우에는 Row 위젯을 추가해야한다.

Row 위젯은 가로로는 최대의 크기를 차지하고 세로로는 최소의 크기를 차지한다.

 

이제 마지막으로, 로고 이미지를 가로 세로 가운데로 정렬시키고 로딩 애니메이션의 색깔도 하얀색으로 변경해보자.

import 'package:flutter/material.dart';

void main() {
  runApp(
    SplashScreen(),
  );
}

class SplashScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          decoration: BoxDecoration(
            color: Color(0xFFF99231),
          ),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Image.asset(
                    'assets/logo.png',
                    width: 200,
                  ),
                  CircularProgressIndicator(
                    valueColor: AlwaysStoppedAnimation(
                      Colors.white,
                    ),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

 

최종으로 만든 앱의 결과물이다!!

애니메이션으로 돌아가는 색상을 흰색으로 변경하기 위해 valueColor 매개변수를 사용한다.

valueColor 의 경우 색상이 애니메이션이 되어야 하기 때문에 Colors.white 를 직접 넣을 수 없다.

대신에 AlwaysStoppedAnimation 이라는 클래스에 감싸서 색상을 변경했다.

반응형
반응형

가볍게 연습용으로 간단한 앱을 만들어 보자.

앱 개발 시 이미 잘 만들어진 오픈 소스 프로젝트를 불러와서 개발하면 편리하게 진행 할 수 있다.

수많은 플러그인이 플러터 오픈 소스 저장소 pub.dev 에 공개되어 있으니 불러와 사용하면 된다.

플러그인 사용법을 알아보자.

플러터 프로젝트를 생성하면 자동으로 생성되는 pubspec.yaml 파일에 원하는 플러그인을 추가하고 pub get 버튼을 클릭하여 프로젝트에서 사용할 수 있다.

자주 사용하는 플러그인 중 하나인 WebView 플러그인 추가하는 예제.

# Dependencies specify other packages that your package needs in order to work.
# To automatically upgrade your package dependencies to the latest versions
# consider running `flutter pub upgrade --major-versions`. Alternatively,
# dependencies can be manually updated by changing the version numbers below to
# the latest version available on pub.dev. To see which dependencies have newer
# versions available, run `flutter pub outdated`.
dependencies:
  flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2
  webview_flutter: 3.0.4

 

자! 이제 간단한 앱을 만들어 보자.

Column 위젯과 Row 위젯만을 사용하여 연습용으로 만든다.

위젯은 내부에서 값이 변경되었을 때 위젯 자체에서 다시 렌더링을 실행 시킬 수 있는 StatefulWidget 과 위젯 내부에서 값이 변경되어도 위젯 자체적으로 다시 렌더링 할 수 없는 StatelessWidget 으로 나뉜다.

이번에는 StatelessWidget 을 직접 구현할 예정이다.

기본 구조는 다음과 같다.

lib/main.dart 파일

import 'package:flutter/material.dart';

void main() {
  runApp(
  	// SplashScreen 위젯을 렌더링.
    SplashScreen(),
  );
}

// StatelessWidget 을 상속 받아 구현한다.
class SplashScreen extends StatelessWidget {

	// build 함수를 필수로 구현해야 한다.
    // 화면에 그리고 싶은 위젯을 입력.
  @override
  Widget build(BuildContext context) {
  }
}

 

 

화면 가운데 글자를 출력하는 앱을 만들어보자.

import 'package:flutter/material.dart';

void main() {
  runApp(
    SplashScreen(),
  );
}

class SplashScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
  
  	// 항상 최상단에 입력되는 위젯
    return MaterialApp(
    
    	// 항상 두번째로 입력되는 위젯
      home: Scaffold(
      
      	// 중앙 정렬 위젯
        body: Center(
        
        	// Text 를 화면에 보여주는 위젯
          child: Text('Splash Screen'),
        ),
      ),
    );
  }
}

 

위 파일을 실행하면 아래와 같은 화면을 가진 앱이 된다.

 

다음에는 배경색을 추가하여 화면을 꾸며보자!!

 

 

반응형
반응형

1. 텍스트 관련 위젯

 - 화면에 글자를 보여주려면 글자를 렌더링할 수 있는 위젯을 사용.

Text(
	'텍스트 내용',
    style: TextStyle(
    	fontSize: 16.0,
        fontWeight: FontWeight.w700,
        color: Colors.blue,
    ),
)

 

2. 제스처 관련 위젯

 - 키보드로 글자를 입력하는 행위 외의 모든 입력을 제스처라고 한다.

 - 탭, 더블 탭, 길게 누르기, 드래그 등 모두가 제스처

 - 제스처 관련 위젯은 하위 위젯에 제스처가 입력됐을 때 인지하고 콜백 함수를 실행한다.

 

2-1. Button 위젯

▶ 텍스트만 있는 버튼

TextButton(
	onPressed: (){},
    style: TextButton.styleFrom(
    	foregroundColor: Colors.red,
    ),
    chlid: Text('텍스트 버튼'),
)

 

▶ 테두리가 있는 버튼

OutlinedButton(
	onPressed: (){},
    style: OutlinedButton.styleFrom(
    	foregroundColor: Colors.red,
    ),
    child: Text('테두리가 있는 버튼'),
)

 

▶ 입체적으로 튀어나온 느낌의 배경이 들어간 버튼

ElevatedButton(
	onPressed: (){},
    style: ElevatedButton.styleFrom(
    	backgroundColor: Colors.red,
    ),
    child: Text('입체적인 버튼'),
)

 

2-2. IconButton 위젯

 - 아이콘을 버튼으로 생성하는 위젯

 - onPressed 변수에 아이콘을 누르면 실행 할 콜백 함수 제공

IconButton(
	onPressed: (){},
    icon: Icon(
    	Icons.home,
    ),
)

 

2-3. GestureDetector 위젯

 - 앱은 모든 입력을 손가락으로 한다.

 - 손가락으로 하는 여러가지 입력을 인지하는 위젯

GestureDetector(
	onTap: (){
    	print('한 번 탭하기.');
    },
    onDoubleTap: () {
    	print('더블 탭하기.');
    },
    onLongPress: () {
    	print('길게 탭하기.');
    },
    onPanStart() {
    	print('수평 또는 수직으로 드래그가 시작됨.');
    },
    onPanUpdate() {
    	print('수평 또는 수직으로 드래그하는 동안 위치가 업데이트 될때마다 실행.');
    },
    onPanEnd() {
    	print('수평 또는 수직으로 드래그가 끝났을 때.');
    },
    onHorizontalDragStart() {
    	print('수평으로 드래그가 시작됨.');
    },
    onHorizontalDragUpdate() {
    	print('수평으로 드래그하는 동안 위치가 업데이트 될때마다 실행.');
    },
    onHorizontalDragEnd() {
    	print('수평으로 드래그가 끝났을 때.');
    },
    onVerticalDragStart() {
    	print('수직으로 드래그가 시작됨.');
    },
    onVerticalDragUpdate() {
    	print('수직으로 드래그하는 동안 위치가 업데이트 될때마다 실행.');
    },
    onVerticalDragEnd() {
    	print('수직으로 드래그가 끝났을 때.');
    },
    onScaleStart() {
    	print('확대가 시작됨.');
    },
    onScaleUpdate() {
    	print('확대가 진행되는 동안 위치가 업데이트 될때마다 실행.');
    },
    onScaleEnd() {
    	print('확대가 끝났을 때.');
    },
    child: Container(
    	decoration: BoxDecoration(
        	Color: Colors.red,
        ),
        width: 100.0,
        height: 100.0,
    ),
)

 

2-4. FloatingActionButton 위젯

 - 화면의 오른쪽 아래에 동그란 플로팅 작업 버튼 구현.

import 'package:flutter/material.dart'

void main() {
	runApp(FloatingActionButtonExample());
}

class FloatingActionButtonExample extends StatelessWidget {
	@override
    Widget build(BuildContext context) {
    	return MateralApp(
        	home: Scaffold(
            	floatingActionButton: FloatingActionButton(
                	onPressed: (){},
                    child: Text('클릭'),
                ),
                body: Container(),
            ),
        );
    }
}

 

3. 디자인 관련 위젯

 - 배경을 추가하거나 간격을 추가하거나 패딩을 추가하는 등 디자인적인 요소를 적용

 

3-1. Container 위젯

 - 말 그대로 다른 위젯을 담는데 사용.

 - 너비와 높이를 지정하거나 배경, 테두리를 추가할 때 사용

Container(
	decoration: BoxDecoration(
    	color: Colors.red,
        border: Border.all(
        	width: 16.0,
            color: Colors.black,
        ),
        borderRadius: BorderRadius.circular(
        	16.0,
        ),
    ),
    height: 200.0,
    width: 100.0,
)

 

3-2. SizedBox 위젯

 - 일반적으로 일정 크기의 공간을 공백으로 두고 싶을 때 사용

 - Container 위젯을 사용해도 공백을 만들 수 있지만 SizedBox 는 const 생성자를 사용했을 때 성능상의 이점을 얻을 수 있음.

SizedBox(
	height: 200.0,
    width: 200.0,
    
    // 크기를 확인하는 예제로 Container 추가.
    child: Container(
    	color: Colors.red,
    ),
)

 

3-3. Padding 위젯

 - child 위젯에 여백을 제공할 때 사용

 - Padding 위젯의 상위 위젯과 하위 위젯 사이의 여백을 둘 수 있음.

Container(
	color: Colors.blue,
    child: Padding(
    	padding: EdgeInsets.all(
        	16.0,
        ),
        child: Container(
        	color: Colors.red,
            width: 50.0,
            height: 50.0,
        ),
    ),
)

 

Margin 과 Padding 같이 사용하는 예제

// 최상위 Container : margin 이 적용되는 대상)
Container(
	color: Colors.black,
    child: Container(
    	color: Colors.blue,
        
        // margin 적용 위치
        margin: EdgeInsets.all(16.0),
        
        // padding 적용
        child: Padding(
        	padding: EdgeInsets.all(16.0),
            
            // padding 이 적용된 Container
            child: Container(
            	color: Colors.red,
                width: 50,
                height: 50,
            ),
        ),
    ),
)

 

3-4. SafeArea 위젯

 - 기기별로 예외 처리를 하지 않고도 안전한 화면에서만 위젯을 그릴 수 있음.

SafeArea(
	// true 이면 적용 : 안전한 영역만 사용(노치 영역을 사용하지 않음)
    // false 이면 미적용: 안전하지 않은 영역까지 사용(노치 영역을 고려하지 않고 사용)
	top: true,
    bottom: true,
    left: true,
    right: true,
    child: Container(
    	color: Colors.red,
        height: 300.0,
        width: 300.0,
    ),
)

 

 

4. 배치 관련 위젯

 - 하위 위젯을 가로 또는 세로로 배치하거나 위젯 위에 위젯을 겹칠 때 사용

 

4-1. Row 위젯

 - 가로로 위젯을 배치

 - 여러개의 child 위젯을 입력 받을 수 있는 children 매개변수 사용.

import 'package:flutter/material.dart';

class RowWidgetExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SizedBox(
          height: double.infinity,
          child: Row(
            // 주축 정렬 지정
            mainAxisAlignment: MainAxisAlignment.start,
            // 반대축 정렬 지정
            crossAxisAlignment: CrossAxisAlignment.center,
            // 넣고 싶은 위젯 입력
            children: [
              Container(
                height: 50.0,
                width: 50.0,
                color: Colors.red,
              ),
              // SizedBox는 일반적으로 공백을
              // 생성할 때 사용
              const SizedBox(width: 12.0),
              Container(
                height: 50.0,
                width: 50.0,
                color: Colors.green,
              ),
              const SizedBox(width: 12.0),
              Container(
                height: 50.0,
                width: 50.0,
                color: Colors.blue,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

 

4-2. Column 위젯

 - 세로로 위젯을 배치

import 'package:flutter/material.dart';

class ColumnWidgetExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: SizedBox(
          width: double.infinity,
          child: Column(
            // 주축 정렬 지정
            mainAxisAlignment: MainAxisAlignment.start,
            // 반대축 정렬 지정
            crossAxisAlignment: CrossAxisAlignment.start,
            // 넣고 싶은 위젯 입력
            children: [
              Container(
                height: 50.0,
                width: 50.0,
                color: Colors.red,
              ),
              // SizedBox는 일반적으로 공백을 생성할 때 사용
              const SizedBox(width: 12.0),
              Container(
                height: 50.0,
                width: 50.0,
                color: Colors.green,
              ),
              const SizedBox(width: 12.0),
              Container(
                height: 50.0,
                width: 50.0,
                color: Colors.blue,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

 

4-3. Flexible 위젯

 - Row 나 Column 에서 사용하는 위젯.

 - Flexible 에서 제공된 child 크기를 최소한으로 차지하게 함.

import 'package:flutter/material.dart';

class FlexibleWidgetExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            children: [
              Flexible(
                // flex는 남은 공간을 차지할 비율을 의미합니다.
                // flex값을 값을 제공하지 않으면 기본값은 1입니다.
                flex: 1,

                // 파란색 Container
                child: Container(
                  color: Colors.blue,
                ),
              ),
              Flexible(
                flex: 1,

                // 빨간색 Container
                child: Container(
                  color: Colors.red,
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

 

4-4. Expanded 위젯

 - Flexible 위젯을 상속하는 위젯.

 - Expanded 를 사용하면 위젯이 남아있는 공간을 최대한으로 차지.

import 'package:flutter/material.dart';

class ExpandedWidgetExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            children: [
              Expanded(
                child: Container(
                  color: Colors.blue,
                ),
              ),
              Expanded(
                child: Container(
                  color: Colors.red,
                ),
              )
            ],
          ),
        ),
      ),
    );
  }
}

 

4-5. Stack 위젯

 - 위젯을 겹치는 기능

 - 플러터의 그래픽 엔진인 스키아 엔진은 2D 엔진이기 때문에 겹친 두께를 표현하지는 못하지만 Stack 위젯을 사용하면 위젯 위에 위젯을 올린 듯한 효과를 줄 수 있음.

import 'package:flutter/material.dart';

class StackWidgetExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Stack(
            children: [
              Container(
                height: 300.0,
                width: 300.0,
                color: Colors.red,
              ),
              Container(
                height: 250.0,
                width: 250.0,
                color: Colors.yellow,
              ),
              Container(
                height: 200.0,
                width: 200.0,
                color: Colors.blue,
              ),
            ],
          ),
        ),
      ),
    );
  }
}

 

반응형

+ Recent posts