Class and Widget
Class → 객체가 가져야 하는 속성과 기능을 정의한 내용을 담고 있는 설계도 역할
객체 → 클래스가 정의된 후 메모리상에 할당되었을 때 이를 객체라고 함
인스턴스 → 클래스를 기반으로 생성, 클래스의 속성과 기능을 똑같이 가지고 있고 프로그래밍 상에서 사용되는 대상
Static
- 인스턴스에 귀속되지 않고, 클래스 통째로 귀속
- 함수 또는 변수가 통째로 클래스에 귀속
ex)
class Employee {
static String building;
String name;
Employee(
String name,
):this.name = name;
void NameAndBuilding(){
print(${this.name}, {building};
}
}
- building 변수에만 static 사용. (static은 클래스에 귀속 되므로 this 사용 불가능)
Widget 이론
- Widget은 모두 ‘불변’의 법칙을 갖고있다.
- 하지만 위젯의 값을 변경해야 할 때가 있다.(색 변경 등)
- 변경이 필요하면 기존 위젯을 삭제해버리고 새로운 위젯으로 대체한다.
StatelessWidget 라이프 사이클
- Constructor로 생성이 되고 생성이 되자마자 build 함수가 실행된다.
- 이전 container 예제와 마찬가지로 변경이 필요하면 새로운 위젯을 만들어버린다.
- 하나의 StatelessWidget은 라이프 사이클 동안 단 한번만 build 함수를 실행한다.
class Person {
// 클래스에서 정의한 변수는 *멤버변수*
String? name;
int? age;
String? gender;
// 생성자는 함수의 모양을 가지고 있다.
// named argument {}로 인자 묶기
Person({String? name, int? age, String? gender}) {
// this.name이 멤버변수임을 알려줌 즉, 들어온 인자를 멤버변수에 할당
this.name = name;
this.age = age;
this.gender = gender;
}
}
void main() {
// named argument로 객체 생성
Person p1 = new Person(age:26);
Person p2 = new Person(gender:'male');
print(p1.age);
print(p2.gender);
}
참고 - 플러터(flutter) 순한 맛 강좌 5 | 플러터에서 제일 중요하다는 위젯이란 무엇일까요?
위젯들의 타입
- Stateless Widget(상태가 없는 정적인 위젯)
- Stateless → 이전 상호작용의 어떠한 값도 저장하지 않음
- 스크린상에 존재만 할 뿐 아무것도 하지 않음
- 어떠한 실시간 데이터도 저장하지 않음
- 어떤 변화(모양, 상태)를 유발시키는 value값을 가지지 않음
- Stateful Widget(계속 움직임이나 변화가 있는 위젯)
- Stateful → Value 값을 지속적으로 추적 보존
Widget tree
- Widget들은 tree 구조로 정리될 수 있음
- 한 Widget내에 얼마든지 다른 widget들이 포함될 수 있음
- Widget은 부모 위젯과 자식 위젯으로 구성
- Parent widget을 widget container라고 부르기도 함
참고 - 플러터(flutter) 순한 맛 강좌 6 | 플러터 프로젝트 폴더와 기본 코드 이해하기 1
pubspec.yaml
- 프로젝트의 메타데이터를 정의하고 관리하는 것 (버전, 사용환경, dart의 버전, dependency, thirdparty library 등 을 정의)
클래스 명과 함수 명
- main(), runApp() → 첫글자 소문자, 즉 함수명
- MyApp() → 첫글자 대문자, 즉 클래스 명 camel case
- Scaffold→ 빈 도화지 같은 앱 화면에 다양한 요소를 배치 할 수 있음
- children: <Widget>[]와 children: []의 차이?
- 전자는 List에 들어가는 type을 Widget으로 명시해 준 것, 후자는 dynamic
leading → 아이콘 버튼이나 간단한 위젯을 왼쪽에 배치할 때
actions → 복수의 아이콘 버튼 등을 오른쪽에 배치할 때
onPressed → 함수의 형태로 일반 버튼이나 아이콘 버튼을 터치했을 때 일어나는 이벤트를 정의
스낵바 구현
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(
title: 'Snack Bar',
theme: ThemeData(primarySwatch: Colors.red),
home: MyPage(),
);
}
}
class MyPage extends StatelessWidget {
const MyPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Snack Bar'),
centerTitle: true,
),
body: Center(
child: TextButton(
child: Text(
'Show me',
style: TextStyle(
color: Colors.blue,
fontSize: 30,
),
),
onPressed: () {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(
'Hello',
textAlign: TextAlign.center,
style: TextStyle(
color: Colors.white
),
),
// 스낵바 배경색
backgroundColor: Colors.teal,
// 스낵바 나타나는 시간
duration: Duration(milliseconds: 1000),
));
},
),
),
);
}
}
토스트바 구현
// pubspec.yaml (fluttertoast 추가)
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
fluttertoast: ^8.0.9
// main.dart
import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Toast',
home: MyPage(),
);
}
}
class MyPage extends StatelessWidget {
const MyPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Toast Message'),
centerTitle: true,
),
body: Center(
child: ElevatedButton(
onPressed: () {
flutterToast();
},
child: Text('Toast'),
),
),
);
}
}
void flutterToast() {
Fluttertoast.showToast(
msg: "This is Center Short Toast",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
backgroundColor: Colors.red,
textColor: Colors.white,
fontSize: 16.0
);
}
'Flutter' 카테고리의 다른 글
[Flutter] TextField 위젯의 textAlignVertical 속성 (TextField 정렬) (0) | 2022.12.28 |
---|---|
[Flutter] 하단바, 페이지 하단에 떠 있는 버튼 위젯(FloatingActionButton) (0) | 2022.12.27 |
[Flutter] Calendar 구현(table_calendar 오픈소스 활용) (0) | 2022.12.26 |
[Flutter] 비동기 프로그래밍 (Future, Stream, async, async*, yeild, yeild*) (0) | 2022.12.22 |
[Flutter] 문법 정리 (0) | 2022.12.22 |