티스토리 뷰
Null Safety
Null safety를 선택하면, 코드에서 사용한 type들은 기본적으로 non-nullable 이 된다. non-nullable 변수는 그 변수를 사용하기 전에 값을 꼭 초기화 시켜야 한다. 선언과 동시에 초기화를 시킬 필요까진 없지만, 해당 변수가 사용되기전에는 값을 할당해야 한다.
변수가 null 값을 가질 수 있도록 하기 위해서는 type 선언에서 type명 뒤에 ?를 붙이면 된다.
Null 관련 연산자
연산자 | 사용예 | 의미 |
?? | A= B??C | B가 null이 아니면 B를 A에 입력하고, null이라면 A에 C를 입력 |
??= | A ??= B | A가 null이면 A에 B를 입력 |
?. | A?.test( ) | A가 null이 아니면 test( )를 실행 |
! | A! | A가 null이 아님을 체크함. if( A != null) 같은 느낌. |
...? | [0, ...?A] | A가 null이더라도 exception을 발생하지 않음 |
Late variables
- non-nullable 변수를 선언한 이후 초기화 된다고 선언할 경우
- 변수의 초기화를 이후에 천천히 하려고 할 경우
가끔 Dart가 코드를 flow analysis 하면서 non-nullable 변수가 사용되기 전에 값이 셋팅는지 검사하는데, 이것이 실패할때가 있다. 이럴때 변수가 사용되기전에 값이 set된다고 당신이 확신한다면, 변수 앞에 late를 표기해라.
변수 앞에 late를 표기하고 또 변수 선언할 때 initalizer도 입력하였다면, 이 initializer는 그 변수가 사용될 때 처음 실행되게 된다. 이러한 lazy initialization은 두가지 경우에서 유용하다.
- 해당 변수가 필요하지 않을 수 도 있으며, 초기화 비용이 클 경우
- 초기화 하려는 변수가 this 에 접근해야할 경우
Constructor
기본적으로 subclass의 constructor가 호출하면 superclass의 unnamed, no-argument constructor가 호출된다. 만약 initializer list가 있을 경우, superclass를 호출하기 전에 먼저 처리한다. 즉, constructor 호출시 실행 순서는,
1. initializer list
2. super class's no-arg constructor, 이때 super class의 argument가 있다면 constructor가 실행되기 전에 처리 된다.
3. main class's no-arg constructor
만약 suepr class에 unnamed, no-argument constructor가 없을 경우, 직접 어떤 constructor를 호출할지 : 뒤, constructor body 사이에 명시해야 한다.
Initializer list
constructor body를 실행하기 전에 instance 변수를 초기화 할 수 있다. 초기화 값들은 콤마(,)로 구분한다.
initializer list 목록은 super클래스 생성자를 호출하기 전에 멤버를 초기화하는 메커니즘을 제공.
initializer list를 가지고 있는 sub-class의 생성자를 호출 하였을 때 실행 순서는,
- Initalizer list
- Super class's no-arg constructor. ( default constructor가 없을 경우, sub-class에서 named constructor를 지정해줘야함)
- Sub-class's no-arg constuctor
initializer list에서 super클래스 call은 initializer list의 맨 마지막에 입력해야한다.
initializer list 를 사용하면
- option parameter나 factory 생성자들을 확인할 수 있다
- constructor에서 final member들을 초기화 할 수 있다
- const structor의 경우 그들이 할 수 있는 작업들이 제한적인데, (임의의 코드가 실행될 수 있는 생성자의 body를 허용하지 않는 것을 쉽게 한다) 단순화 할 수 있다.[2]
참고자료
[1] Dart.dev, Language-tour#constructor
[2] Stackoverflow, What is the difference between constructor and initializer list in Dart? (2018년 8월)
[3] Flutter by Example, Initializer lists and final properties (2020년 7월)
with, implements and extends 차이
extends : 부모 클래스의 모두(properties, variables, functions)를 상속 받을 필요가 있을 때 사용. 특별한 구현 없이 바로 부모 클래스의 메소드를 사용 가능. 오버라이드하여 수정도 가능. 오직 하나의 부모만 가질 수 있음. 즉 부모 클래스보다 좀더 세부적인 클래스가 필요할 때 사용. 세부적이 구현이 완성되어있는 일반적인 클래스를 extends할 수 있음
implements : 부모(?) 클래스의 인터페이스만 구현하고자 할 때 사용. 하위 클래스에서 모든 메소드를 오버라이딩하여 구현 필요. 여러 부모(?) 클래스를 가질 수 있음. 일반 클래스나 abstract 클래스를 implements할 수 있음
with : extends와 implement의 특징을 가지고 있음. 구현하지 않더라도 부모의 메소드를 호출 할 수 있음. mixin 클래스를 with에 사용할 수 있음
IgnorePointer 와 AbsorbPointer 차이
Stack으로 2개의 버튼 A(top), B(bottom)을 중첩되게 구성하고, A버튼을 AbsorbPointer로 감싼뒤 absorbing 특성(property)을 true로 설정하면 버튼을 눌렀을 때 A, B 버튼이 둘다 눌러지지 않는다. 반면에 A버튼을 IgnorePointer로 감싼 뒤 Ignoring 특성을 true로 설정하면 A버튼은 눌러지지 않지만 그 아래 layer에 있는 B 버튼은 클릭이 된다. [1]
IgnorePointer
Inheritance : Object > Diagnosticable Tree > Widget > RenderObjectWidget > SingleChildRenderObjectWidget > IgnorePointer
ignoring 특성을 true로 설정하면, 위젯 자신과 그 하위 위젯들을 hit testing으로 부터 invisible하게 한다. 터치해도 아무 변화가 없다. 위젯이 layout의 공간은 여전히 차지하고 있지만 RenderBox.hitTest에서 false 를 리턴하기 때문에 located event의 타겟이 될 수 없습니다.
ignoringSemantics 특성이 true이면, 하위 위젯트리는 semantics layer에게 invisible하게 된다. 특성 값이 null이면, ignoring 특성 값을 사용한다. (ingnoringSematics 특성에 대한건 이해가 안되네...)
AbsorbPointer
Inheritance : Object > Diagnosticable Tree > Widget RenderObjectWidget > SingleChildRenderObjectWidget > AbsorbPointer
Absorbing 특성이 true이면, hit testing을 중단시켜서 sub tree가 pointer event를 받는 것으로부터 보호합니다. layout의 공간은 여전히 차지하고 있습니다. 단지, RenderBox.hitTest로부터 true 값을 반환하기 때문에 children이 located events의 타겟이 되는 것으로부터 보호할 뿐입니다.
그리고 stack위젯을 이용하여 AbsorbPointer로 감싸여진 위젯의 아래 layer에 다른 위젯이 있을 경우, 이 위젯 또한 pointer event를 받을 수 없습니다. (겹쳐지지 않는 부분에 대해서는 아래 layer 위젯은 pointer event를 받을 수 있음)
두 위젯의 설명을 보면 RenderBox.hitTest에서 반환하는 값이 다르다.
hitTest method[5]
Determines the set of render objects located at the given position.
Returns true, and adds any render objects that contain the point to the given hit test result, if this render object or one of its descendants absorbs the hit (preventing objects below this one from being hit). Returns false if the hit can continue to other objects below this one
참고자료
[1] Woolha.com https://www.woolha.com/tutorials/flutter-using-ignorepointer-absorbpointer-examples
[2] Flutter.dev https://api.flutter.dev/flutter/widgets/IgnorePointer-class.html
[3] Flutter.dev https://api.flutter.dev/flutter/widgets/AbsorbPointer-class.html
[4] Stackoverflow https://stackoverflow.com/questions/55430842/flutter-absorbpointer-vs-ignorepointer-difference (2019년 4월)
[5] Flutter.dev https://api.flutter.dev/flutter/rendering/RenderBox/hitTest.html
'Dart & Flutter' 카테고리의 다른 글
오늘의 Flutter 공부 (0) | 2021.11.30 |
---|---|
Flutter at Google I/O 2021 (0) | 2021.05.22 |
Flutter 공부 (0) | 2020.10.13 |
UI 디자인, 테마, 개발된 앱 정보를 얻을 수 있는 사이트 (0) | 2020.03.11 |
Dart 공부 정리 20200204 (0) | 2020.02.04 |
- Total
- Today
- Yesterday
- UX
- TextField
- 앱 프로그래밍
- 한빛미디어
- plugin
- 디자인
- Flutter
- BLE
- 앱
- TextFormField
- 문제 해결
- Bluetooth
- 이미지
- error
- addPostFrameCallback
- IOS
- 앱개발
- UI
- 인사이트
- SizedBox
- 크롬
- firebase
- 다트
- DART
- 에러
- 플러터
- hide
- Syncfusion
- Chrome
- position
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |