[Flutter/플러터] 플러터 상태관리 - Getx(GetBuilder, Reactive State Manager)(1)
Getx에는 GetBuilder 와 Reactive State Manager가 존재한다. 이에 대해서 알아보자.. https://pub.dev/packages/get 1. Simple State Manager with GetBuilder ▶ state가 변할 때 마다, 변한 state를 화면에 다시 그려줌 사용 예시) Controller controller = Get.put(Controller())); ... GetBuilder( builder : (_) => Text('${controller.x}') get을 통해 _x 값을 가져오며, increment를 통해 증가된 값을 확인하기 위래 변수 값이 바뀌었다고 알려주는 update 매서드를 호출해야 한다. class Controller extends Ge..
2022.09.23
no image
[Flutter/플러터] 키보드 overflowed 문제 해결하기(키보드 열림 무시)
1) 키보드가 위젯을 가리는 경우 다음과 같이 BOTTOM OVERFLOWED BY... 에러가 발생한다. 이를 해결하기 위한 방법은, 첫번째로 가려진 위젯의 제일 상위 위젯을 child : Column( children : [ Container( ... ), ... 아래와 같이 SingleChildScrollView로 감싼다. child: SingleChildScrollView( keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag, child: Column( children: [ Container( alignment: Alignment.centerLeft, ... ), 여기서 중요한 것은, 아래 코드를 넣는 것이다. keyboardDis..
2022.09.21
[Flutter/플러터] Dart에서의 변수 할당(final, const, static)
final, const, static 모두 변수의 형식을 확장하는 키워드 ★ final과 const 공통점 : 값을 변경할 수 없도록 함. final 한 번만 할당 할 수 있음 클래스 수준에서 변수를 할당하기 전에 사용 런타임 시 값 결정 클래스의 생성자에서 할당하는 모든 변수에 final 사용 const final과 달리 할당하기 전에 선언하지 않음 컴파일 이후 항상 같은 값을 가짐 static 클래스 인스턴스를 만들지 않고 바로 접근 가능 class StaticExam { static int num; static show() { print("#GFG the value of num is ${StaticMem.num}") ; } } void main() { StaticExam.num = 75; Stati..
2022.09.21
[Flutter/플러터] 뒤로가기 버튼 두 번 클릭 후 앱 종료하기
로그인 후, 메인 화면에서 뒤로가기를 두 번 눌렀을 때, toast 메세지를 띄운 후 앱 종료하는 방법을 알아보고자 한다. 1. MainScreen에서 WillPopScope위젯 설정과 함수 만들기 class _MainScreenState extends State { ... @override Widget build(BuildContext context) { return Scaffold( body: WillPopScope( onWillPop: onWillPop, Scaffold 위젯의 body에서 WillpopScope 위젯으로 나머지 위젯들을 감싼다. 2. DateTime 변수 선언 및 관련 함수 만들기 아래 변수를 선언해준 뒤, _MainScreenState 안에서 뒤로 가기 버튼을 처리하는 onWil..
2022.08.02
no image
[Flutter/플러터] flutter_native_splash를 활용하여 splash 화면 만들기
1. 아래 패키지를 설치한다. https://pub.dev/packages/flutter_native_splash flutter_native_splash | Flutter Package Customize Flutter's default white native splash screen with background color and splash image. Supports dark mode, full screen, and more. pub.dev - flutter 터미널 창에서 해당 코드 적용 flutter pub add flutter_native_splash - pubspec.yaml 에서 dependencies 추가 dependencies: flutter_native_splash: ^2.2.7 - mai..
2022.08.02
no image
[Flutter] 플러터 POST response 및 request 모델 자동 코드 사이트
api를 통해 json 형태의 데이터를 주고 받을 때, json 전송 혹은 결과 값만을 가지고 모델 코드를 바로 짜주는 사이트가 존재한다. https://quicktype.io/ Convert JSON to Swift, C#, TypeScript, Objective-C, Go, Java, C++ and more • quicktype { "people": [ { "name": "Atticus", "high score": 100 }, { "name": "Cleo", "high score": 900 }, { "name": "Orly" }, { "name": "Jasper" } ] } Provide sample JSON files, URLs, JSON schemas, or GraphQL queries. quic..
2022.06.14
no image
[flutter/플러터] MaterialApp과 Scaffold
MaterialApp : flutter의 핵심 구성 요소이자 앱의 시작점. 미리 정의된 class로 flutter의 Material 구성 요소를 사용하고 앱의 머티리얼 디자인을 따를 것임을 알려줌. 또한, 머티리얼 디자인 앱을 구축하는 데 필요한 여러 위젯 Navigator, Theme를 소개하는 위젯. Scaffold : materialApp 밑에 있으며, AppBar, Bottom NavigationBar, Drawer, Floating ActionButton 등과 같은 많은 기본 기능을 제공함 그림 출처 : https://proandroiddev.com/flutter-from-zero-to-comfortable-6b1d6b2d20e
2022.05.23
no image
[flutter/플러터] Row, Column
요소 가로 배치 : Row() 세로 배치 : Column()
2022.05.23
320x100
728x90

 

Getx에는 GetBuilderReactive State Manager가 존재한다.

이에 대해서 알아보자..

 

https://pub.dev/packages/get

 

 

 

1. Simple State Manager with GetBuilder

  ▶  state가 변할 때 마다, 변한 state를 화면에 다시 그려줌

 

 

       사용 예시)

Controller controller = Get.put(Controller()));
                ...
  
GetBuilder<Controller>(
	builder : (_) => Text('${controller.x}')

 

 

 

get을 통해 _x 값을 가져오며, increment를 통해 증가된 값을 확인하기 위래

변수 값이 바뀌었다고 알려주는 update 매서드를 호출해야 한다. 

class Controller extends GetxController{
    int _x = 0;
    int get x => _x;
    
    void increment(){
    	_x++;
        update();
      }  
 }

 

 

init을 통해 직접 controller 인스턴스를 생성할 수도 있다.

 

이때, 만들었던 인스턴스는 삭제하고 아래와 같이 find를 불러온 다음 Controller 타입을 지정해 주고 

x 값을 호출해 주면 된다. 

//Controller controller = Get.put(Controller()));
                ...
  
GetBuilder<Controller>(
	builder : (_) => Text('${Get.find<Controller>().x}')
    
                ...
          ), 
          
    ElevatedButton(
    	onPressed: (){
        	Get.find<Controller>().increment();

 

 

 

장점 : 메모리를 아낄 수 있다.

단점 : 데이터를 업데이트 하기 위해서는 항상 update 매서드를 불러와 수동으로 작업을 해 주어야 함

 

 


 

2. Reactive State Manager

  ▶  state를 바로바로 반영해주는 매니저 역할

 

 

Reactive  =  바로바로 반영하는 

reactive state manager는 state를 바로바로 반영해주는 매니저 역할을 한다.

async 비동기 방식이며,  state가 지속적으로 변하는 경우에 사용하기 적합하다.

 

 

장점 : 1) 자동으로 UI를 업데이트 해줌 

           2) getbuilder 보다는 무거우나 부담될 정도는 아님 

 

 

 

 

 Rx란?

     ReactiveX 의 줄임말로 어떤 데이터의 흐름을 관찰하는 데 포커스를 둠

    data stream = Observable  ↔ Observer

 

다른 작업을 하다가 observer가 데이터 발생을 감지할 때만 반응하면 됨

 

 

 


 

 

 

reactive state manager는 MVC 패턴으로 주로 생성한다. 

 

 

 

 MVC 패턴이란? 

 

     M = Model  데이터를 관리하는 역할, 데이터를 정의하고 수정하거나 삭제하는 데이터 가공 역할도 함

     V = View 사용자에게 보여지는 UI를 관리해 주는 역할

     C = Controller 각각 독립적으로 일하는 모델과 뷰를 중간에서 연결해주는 역할

 

 

      흐름으로 이해하기

 

 

      1) 모델이 가진 데이터를 뷰를 통해 전달하며 화면에 출력한다. 

      2) 뷰에서 사용자 이벤트인 버튼 클릭이 발생했을 때 컨트롤러에서 모델의 데이터를 변경하여

           UI를 업데이트 시켜준다. 

 

 

 

 

 

 

아래 예시 코드를 보자

 

model.dart

class Person{
    int age;
    String name;
    
    Person({this.age = 0, this.name = ''});    
}

 

 

controller.dart

class Controller extends GetxController{
    //1. observable 만들기 
    final person = Person().obs;
    
    void updateInfo(){
    	person.update((val) {
        	val?.age++;
            val?.name = 'Observable';
        });
     }   
 }

이때, obs는 Rx 인스턴스를 리턴하며, observable 이다.

 

updateInfo에서의 update 매서드는 위의 getbuilder에서의 update 매서드와는 다르다.

person.update((val) { }); 는 state의 현재 값을 가져오게 한다.  

(getbuilder의 update 매서드는 말 그대로 값을 update 시키는 역할을 한다..)

 

 

 

view.dart

class View extends StatelessWidget{
	...
    //1. 컨트롤러 인스턴스 생성 후 dependency injection 해주기
    final Controller controller = Get.put(Controller());
    
	...
    
	return Scaffold(
		body : Center(
        	//2. listener인 observer 생성하기 
    		child : Getx<Controller>(builder: (_) => Text(
              'Name : ${controller.person().name} ' )),
         ),
         ...
         //3. 수행할 controller 작업 불러오기 
         floatingActionButton: FloatingActionButton(
         	onPressed : (){
            	controller.updateInfo();
                }
           ),
           ...
    );          
}

 

이번에는 obx를 통해 값을 업데이트 시켜보자.

 

class View extends StatelessWidget{
	...
	return Scaffold(
		body : Center(
    		child : Obx((_) => Text(
              'Name : ${controller.person().name} ' )),
         ),
         ... 
}

 

 

 

정리

 

 

obx :

  • observable(obs)의 변화를 listen 함
  • Controller 인스턴스가 미리 다른 곳에 initialize 되어 있어야 함 

 

Getx 

  •  Observable(obs)의 변화를 listen 함
  • 자체적으로 Controller 인스턴스를 initialize 할 수도 있음
  • obx보다 다양한 기능을 내장하고 있어서 좀 무거울 수 있음

 

Getbuilder 

  • Observable(obs)의 변화를 listen 하지 않음
  • 수동으로 UI를 리빌드 해야함, 반드시 update 매서드 호출 필요
  • 자체적으로 Controller 인스턴스를 initialize 할 수 있음 

 

 

 

출처 및 참고 : 유튜브 코딩셰프

 

728x90
반응형
320x100
728x90

 

 

 

1) 키보드가 위젯을 가리는 경우

다음과 같이 BOTTOM OVERFLOWED BY... 에러가 발생한다.

 

 

이를 해결하기 위한 방법은,

첫번째로 가려진 위젯의 제일 상위 위젯을 

child : Column(
	children : [
    	Container(
        	...
            ),
            ...

아래와 같이 SingleChildScrollView로 감싼다. 

child: SingleChildScrollView(
          keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,
          child: Column(
            children: [
              Container(
                alignment: Alignment.centerLeft,
                ...
                ),

여기서 중요한 것은, 아래 코드를 넣는 것이다. 

keyboardDismissBehavior: ScrollViewKeyboardDismissBehavior.onDrag,

 

 

 

2) 키보드 열린 채로 뒤로가기 버튼을 누르거나, 텍스트 제출과 버튼을 눌렀을 때 나타나는

    overflowed 문제 해결하는 방법이다.

 

child: GestureDetector(
          behavior: HitTestBehavior.opaque,
          onTap: () {
            FocusScope.of(context).unfocus();
          },
          ...

 

위젯을 GestureDetector로 감싼 뒤, 위와 같이 코드를 작성해준다.

HitTestBehavior.opaque란 

범위 내에서 이벤트를 수신하며, 시각적으로 뒤에있는 타겟 또한 이벤트를 수신할 수 있도록 하는 것이다.

 

사용자가 해당 위젯 외 부분을 tap 하면 unfocus를 하도록 한다. 

 

 

 

 

728x90
반응형
320x100
728x90

final, const, static 모두 변수의 형식을 확장하는 키워드

 

★ final과 const 공통점 : 값을 변경할 수 없도록 함.

 

final 

  • 한 번만 할당 할 수 있음
  • 클래스 수준에서 변수를 할당하기 전에 사용
  • 런타임 시 값 결정 
  • 클래스의 생성자에서 할당하는 모든 변수에 final 사용

 


 

const 

  • final과 달리 할당하기 전에 선언하지 않음
  • 컴파일 이후 항상 같은 값을 가짐

 


 

static

  • 클래스 인스턴스를 만들지 않고 바로 접근 가능
class StaticExam {
	static int num;
	static show() {
		print("#GFG the value of num is ${StaticMem.num}") ;
	}
}
void main() {
	StaticExam.num = 75;
	
	StaticExam.show();
	
}

 


 

추가)

~/ : 정수 나눗셈 기호, 소수점 반환하지 않음

as : 형변환 키워드

is, is! : ==, != 와 같음 

 

?? : 값이 존재하지 않는 상황에 할당할 수 있음

this.userAge = user.age ?? 18;

     user.age가 null이면 18을 할당함

 

??= : 객체가 null이면 백업값을 할당하고 아니면 객체 그대로를 반환함

int x = 5;
x ??= 3;

 

 

참고 및 출처 : 플러터 인 액션

728x90
반응형
320x100
728x90

 

로그인 후, 메인 화면에서 

뒤로가기를 두 번 눌렀을 때, toast 메세지를 띄운 후 앱 종료하는 방법을 

알아보고자 한다.

 

 

 

1. MainScreen에서  WillPopScope위젯 설정과 함수 만들기 

class _MainScreenState extends State<MainScreen> {
	...
    
    @override
  	Widget build(BuildContext context) {
    	return Scaffold(
        	body: WillPopScope(
        		onWillPop: onWillPop,

Scaffold 위젯의 body에서 WillpopScope 위젯으로 나머지 위젯들을 감싼다.

 

 

 

 

 

 

2. DateTime 변수 선언 및 관련 함수 만들기

 

아래 변수를 선언해준 뒤, _MainScreenState 안에서 뒤로 가기 버튼을 처리하는 onWillPop() 함수를 만든다.

 

DateTime? currentBackPressTime;
Future<bool> onWillPop(){

    DateTime now = DateTime.now();

    if(currentBackPressTime == null || now.difference(currentBackPressTime!) 
    > Duration(seconds: 2))
    {

      currentBackPressTime = now;
      final msg = "'뒤로'버튼을 한 번 더 누르면 종료됩니다.";

      Fluttertoast.showToast(msg: msg);
      return Future.value(false);

    }

    return Future.value(true);

  }

 

 

 

 

토스트 메세지 패키지는 아래에서 설치

https://pub.dev/packages/fluttertoast

 

fluttertoast | Flutter Package

Toast Library for Flutter, Easily create toast messages in single line of code

pub.dev

 

 

 

 

 

 

 

 

 

※ 라우터 사용 시, 로그인 화면에서 메인 화면으로 넘어갈 때 주의해야 할 부분이 있다.

 

Navigator.push 가 아닌

 Navigator.pushNamedAndRemoveUntil(context, RouteName, (route) => false);

pushNamedAndRemoveUntil을 사용해 주어야

메인화면에서 뒤로가기를 눌렀을 때, 로그인 화면으로 돌아가지 않고 바로 종료되는 것을 볼 수 있다. 

 

 

 

 

 

 

 

 

728x90
반응형
320x100
728x90

1. 아래 패키지를 설치한다.

https://pub.dev/packages/flutter_native_splash

 

flutter_native_splash | Flutter Package

Customize Flutter's default white native splash screen with background color and splash image. Supports dark mode, full screen, and more.

pub.dev

- flutter 터미널 창에서 해당 코드 적용

flutter pub add flutter_native_splash

-  pubspec.yaml 에서 dependencies 추가

dependencies:
  flutter_native_splash: ^2.2.7

- main.dart 에 import

import 'package:flutter_native_splash/flutter_native_splash.dart';

 

 

2.  pubspec.yaml과 같은 위치에 flutter_native_splash.yaml 파일을 만든다

(아래 내용은 패키지 설명 사이트 Read.me에서 확인 가능하다.)

flutter_native_splash:
  # This package generates native code to customize Flutter's default white native splash screen
  # with background color and splash image.
  # Customize the parameters below, and run the following command in the terminal:
  # flutter pub run flutter_native_splash:create
  # To restore Flutter's default white splash screen, run the following command in the terminal:
  # flutter pub run flutter_native_splash:remove

  # color or background_image is the only required parameter.  Use color to set the background
  # of your splash screen to a solid color.  Use background_image to set the background of your
  # splash screen to a png image.  This is useful for gradients. The image will be stretch to the
  # size of the app. Only one parameter can be used, color and background_image cannot both be set.
  color: "#42a5f5"
  #background_image: "assets/background.png"

  # Optional parameters are listed below.  To enable a parameter, uncomment the line by removing
  # the leading # character.

  # The image parameter allows you to specify an image used in the splash screen.  It must be a
  # png file and should be sized for 4x pixel density.
  #image: assets/splash.png

  # The branding property allows you to specify an image used as branding in the splash screen.
  # It must be a png file. It is supported for Android < v12, iOS and the Web.
  #branding: assets/dart.png

  # To position the branding image at the bottom of the screen you can use bottom, bottomRight,
  # and bottomLeft. The default values is bottom if not specified or specified something else.
  #branding_mode: bottom

  # The color_dark, background_image_dark, image_dark, branding_dark are parameters that set the background
  # and image when the device is in dark mode. If they are not specified, the app will use the
  # parameters from above. If the image_dark parameter is specified, color_dark or
  # background_image_dark must be specified.  color_dark and background_image_dark cannot both be
  # set.
  #color_dark: "#042a49"
  #background_image_dark: "assets/dark-background.png"
  #image_dark: assets/splash-invert.png
  #branding_dark: assets/dart_dark.png

  # Android 12 handles the splash screen differently than previous versions.  Please visit
  # https://developer.android.com/guide/topics/ui/splash-screen
  # Following are Android 12 specific parameter.
  android_12:
    # The image parameter sets the splash screen icon image.  If this parameter is not specified,
    # the app's launcher icon will be used instead.
    # Please note that the splash screen will be clipped to a circle on the center of the screen.
    # App icon with an icon background: This should be 960×960 pixels, and fit within a circle
    # 640 pixels in diameter.
    # App icon without an icon background: This should be 1152×1152 pixels, and fit within a circle
    # 768 pixels in diameter.
    #image: assets/android12splash.png

    # Splash screen background color.
    #color: "#42a5f5"

    # App icon background color.
    #icon_background_color: "#111111"

    # The image_dark parameter and icon_background_color_dark set the image and icon background
    # color when the device is in dark mode. If they are not specified, the app will use the
    # parameters from above.
    #image_dark: assets/android12splash-invert.png
    #color_dark: "#042a49"
    #icon_background_color_dark: "#eeeeee"

  # The android, ios and web parameters can be used to disable generating a splash screen on a given
  # platform.
  #android: false
  #ios: false
  #web: false

  # Platform specific images can be specified with the following parameters, which will override
  # the respective image parameter.  You may specify all, selected, or none of these parameters:
  #image_andriod: assets/splash-andriod.png
  #image_dark_android: assets/splash-invert-android.png
  #image_ios: assets/splash-ios.png
  #image_dark_ios: assets/splash-invert-ios.png
  #image_web: assets/splash-web.png
  #image_dark_web: assets/splash-invert-web.png
  #background_image_android: "assets/background-android.png"
  #background_image_dark_android: "assets/dark-background-android.png"
  #background_image_ios: "assets/background-ios.png"
  #background_image_dark_ios: "assets/dark-background-ios.png"
  #background_image_web: "assets/background-web.png"
  #background_image_dark_web: "assets/dark-background-web.png"
  #branding_andriod: assets/brand-android.png
  #branding_dark_android: assets/dart_dark-android.png
  #branding_ios: assets/brand-ios.png
  #branding_dark_ios: assets/dart_dark-ios.png

  # The position of the splash image can be set with android_gravity, ios_content_mode, and
  # web_image_mode parameters.  All default to center.
  #
  # android_gravity can be one of the following Android Gravity (see
  # https://developer.android.com/reference/android/view/Gravity): bottom, center,
  # center_horizontal, center_vertical, clip_horizontal, clip_vertical, end, fill, fill_horizontal,
  # fill_vertical, left, right, start, or top.
  #android_gravity: center
  #
  # ios_content_mode can be one of the following iOS UIView.ContentMode (see
  # https://developer.apple.com/documentation/uikit/uiview/contentmode): scaleToFill,
  # scaleAspectFit, scaleAspectFill, center, top, bottom, left, right, topLeft, topRight,
  # bottomLeft, or bottomRight.
  #ios_content_mode: center
  #
  # web_image_mode can be one of the following modes: center, contain, stretch, and cover.
  #web_image_mode: center

  # The screen orientation can be set in Android with the android_screen_orientation parameter.
  # Valid parameters can be found here:
  # https://developer.android.com/guide/topics/manifest/activity-element#screen
  #android_screen_orientation: sensorLandscape

  # To hide the notification bar, use the fullscreen parameter.  Has no effect in web since web
  # has no notification bar.  Defaults to false.
  # NOTE: Unlike Android, iOS will not automatically show the notification bar when the app loads.
  #       To show the notification bar, add the following code to your Flutter app:
  #       WidgetsFlutterBinding.ensureInitialized();
  #       SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom, SystemUiOverlay.top]);
  #fullscreen: true

  # If you have changed the name(s) of your info.plist file(s), you can specify the filename(s)
  # with the info_plist_files parameter.  Remove only the # characters in the three lines below,
  # do not remove any spaces:
  #info_plist_files:
  #  - 'ios/Runner/Info-Debug.plist'
  #  - 'ios/Runner/Info-Release.plist'

 

3. 원하는 설정만을 활성화 한다.

 

사진 혹은 로고 위치를 image에 설정하면 된다.

(# 활성화 단축키 : ctrl + /)

flutter_native_splash:
  
  color: "#FFFFFF"
  image: images/사진_파일_명

  android_12:
    image: images/사진_파일_명
    color: "#FFFFFF"

  android: true
  ios: true
  web: false

  fullscreen: true

 

4. 패키지 실행하기

 

위와 같이 설정을 완료한 뒤, flutter 터미널 창에서 아래 코드를 실행시킨다.

flutter pub run flutter_native_splash:create

단, 설정을 변경했을 때, 

flutter pub run flutter_native_splash:remove

remove를 시킨 다음 다시 create를 해야만 변경된 설정이 적용된다.

 

 

5. main.dart 설정

 

(firebase initialApp이 완료됐을 때, splash를 제거하고 앱을 구동하도록 함.)

Future main() async{
  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
  FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
  Firebase.initializeApp().whenComplete(() => {
    FlutterNativeSplash.remove() });
  runApp(const MyApp());
}

 

 

728x90
반응형
320x100
728x90

api를 통해 json 형태의 데이터를 주고 받을 때, 

json 전송 혹은 결과 값만을 가지고 모델 코드를 바로 짜주는 사이트가 존재한다. 

 

 

https://quicktype.io/

 

Convert JSON to Swift, C#, TypeScript, Objective-C, Go, Java, C++ and more • quicktype

{ "people": [ { "name": "Atticus", "high score": 100 }, { "name": "Cleo", "high score": 900 }, { "name": "Orly" }, { "name": "Jasper" } ] } Provide sample JSON files, URLs, JSON schemas, or GraphQL queries.

quicktype.io

 

 

예를 들어, 

api request body가 다음과 같으면 

 

{
  "category": "members",
  "home": "seoul",
  "userInfo": [
    {
      "name": "yerim",
      "age": 20,
      "birth": "0820",
      "likes": [
        "watermelon",
        "book",
        "coding"
      ]
    }
  ]
}

 

 

다음과 같은 dart 코드를 제공해준다. 

 

 

 

 

dart 뿐만 아니라 kotlin, java, swift 등 다양한 언어들을 지원해주니

빠른 코드 작성으로 이용하기 좋은 것 같다.

728x90
반응형
320x100
728x90

 

MaterialApp :

flutter의 핵심 구성 요소이자 앱의 시작점.

미리 정의된 class로 flutter의 Material 구성 요소를 사용하고 앱의 머티리얼 디자인을 따를 것임을 알려줌.

또한, 머티리얼 디자인 앱을 구축하는 데 필요한 여러 위젯 Navigator, Theme를 소개하는 위젯.

 

 

Scaffold :

materialApp 밑에 있으며, AppBar, Bottom NavigationBar, Drawer, Floating ActionButton 등과

같은 많은 기본 기능을 제공함

                   

 

 

 

그림 출처 : https://proandroiddev.com/flutter-from-zero-to-comfortable-6b1d6b2d20e

728x90
반응형

[flutter/플러터] Row, Column

얘리밍
|2022. 5. 23. 14:03
320x100
728x90

 

 

요소 가로 배치 : Row()

 

 

       세로 배치 : Column()

728x90
반응형