flutter - ChangeNotifierProvider 사용법 설명.

* provider 가 필요한 이유.  - 예를 들면 flutter에서 버튼을 클릭한 경우 다른 위젯이나 상위 위젯의 리빌드를 구현하기 위해 필요하다. * 설명.  - ChangeNotifierProvider에 ChangeNotifier 상속 받은 클래스를 등록하면 하위 위젯에서 등록한 것을 찾아 사용할 수 있습니다. 즉 상위 위젯에서 하위 위젯으로 흐르는 데이터의 이동 통로를 만든다 생각하면 됩니다.  - 리빌드가 필요한 위젯을 지정합니다.   + Consumer, context.watch, Provider.of<Counter>(context, listen: true) 사용.  - 갱신이 필요한 경우 ChangeNotifierProvider에 등록한 ChangeNotifier 상속 받은 클래스를 찾아 notifyListeners() 호출하면, 위에서 지정한 리빌드가 필요한 위젯을 리빌드 합니다.   + 데이터 사용은 context.read<Counter>(), Provider.of<Counter>(context, listen: false)으로 합니다.  * 중요 - 아래 함수의 차이를 알아야 합니다.  - context.read<Counter>(), Provider.of<Counter>(context, listen: false)   + 데이터에 접근만 합니다.  - context.watch, Provider.of<Counter>(context, listen: true), Consumer   + 데이터에 접근도 하고, notifyListeners() 호출시 리빌하는 위젯을 지정하는 기능도 있습니다.   + 이 함수나 클래스를 사용하지 않으면 notifyListeners() 호출해도 리빌드 하지 않습니다.  * 공식 사이트.  -  https://pub.dev/packages/provider * 코드 구현.  - https://pub.dev/packages/provider/example 의 샘플 코

dart (flutter) 문법 - factory 키워드.

dart (flutter)에서 지원하는 factory 기능에 대해 정리 합니다.  * 설명.  - 생성자는 원래 리턴할 수 없지만, factory 키워드를 사용하면 현재 클래스와 자식 클래스의 인스턴스를 생성자에서 리턴할 수 있게 됩니다.  - 아래 코드의 주석으로 설명 합니다. 동작과 제한 사항을 알 수 있습니다.

사용기- 분리형 키보드 Cloud Nine C959 ErgoTKL

이미지
분리형 키보드 Cloud Nine C959 ErgoTKL 약 한달정도 사용하고 사용기 올립니다. 하단에 사진이 있고 사진 클릭하면 크게 볼 수 있습니다. * 장점.  - 어깨 피고 타이핑 할 수 있습니다.  - 손의 피로도가 낮습니다. 일반키보드는 손을 모아치다 보니 손목도 안쪽으로 꺾어져 있는데 분 ErgoTKL은 분리형 키보드와 높이조절로 손목이 펴져서 그런지 편했습니다.  - 매크로와 휠을 지원해 키보드로 할 수 있는 기능들이 많습니다. 소프트웨어를 다운받아 설치하면 됩니다.  https://cloudnineergo.com/pages/downloads  - 다른 분리형 키보드에 비해서 가격이 준수 했습니다. 다른 브랜드들은 옵션까지 하면 오히려 이게 저렴한 편이었습니다. ErgoTKL은 옵션을 추가하지 않아도 손목받침대, 높이조절 할 수 있습니다.   - 손목 받침대 질이 좋습니다. * 단점.  - 마우스 위치가 좀 애매합니다.  - Esc 버튼 위치가 달라 손이 잘못 누를 때가 있습니다.  - 오른쪽 끝 기능키가 붙어 있어 백스페이스, 엔터가 간혹 잘못 누를 때가 있습니다.  - 한영키가 없어 레지스트리 설정으로 쉬프트+스페이스바 로 사용합니다.   + [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters]   + "LayerDriver KOR"="kbd101c.dll"  - 양쪽 키보드 연결이 Usb-c 케이블이라 아무 케이블이나 연결해도 가능할 줄 알았는데 다른 케이블로는 안됩니다.    + 테스트 해보니 A8-B8 핀이 연결되야 하는데 이게 연결된 케이블이 없습니다. Usb-c 핀에서 GND, VCC, D+, D-, A5-B5, A8-B8 이 연결되야 합니다. 공식홈에서 구입하거나 DIY해야 합니다. (SBU (Secondary BUS)) * 사용기.  - 2-3일 정도 치니 금방 적응했습니다.  - 키 위치가 어색한 곳은 3M 욕실용

dart (flutter) 문법 - ! (느낌표, exclamation mark)

// 리턴값이 항상 null이 아니지만 예를 위한 함수. // int? 는 getInt()가 null을 리턴할 수 있다고 명시해 준다. int? getInt () { return 3 ; } void main () { // int? 는 변수에 null 을 허용하는 표현 . int? a = getInt() ; // ERROE int b 는 null 을 허용하지 않는데 // getInt() 는 null 을 리턴할 수도 있으므로 에러가 난다 . //int b = getInt(); // getInt()! 에서 null 을 리턴하지 않는다고 // getInt() 의 끝에 ! 를 명시해 에러가 나지 않는다 . int c = getInt()! ; } null 에러가 많이 나서 이런 기능을 추가 했다고 하는데 그다지 좋은 해결법이 아닌거 같다. !를 붙여도 에러가 날 수 있는 구멍이 많다.

dart (flutter) 문법 - 클래스. class, abstract, implements, factory

클래스 기본 예제. dart에서는 단일 상속만 가능하다. class Point { double? x ; double? y ; // 이름 없는 생성자 . 하나만 가능하다 . Point(double x , double y) { this . x = x ; this . y = y ; } // 이름있는 생성자 . Point. init () : x = 0 , y = 0 { } // 이름 없는 생성자 호출 . Point. init2 () : this ( 0 , 0 ) { } int GetV () { return 1 ; } } class Point3D extends Point { final bool i3D = true; double z = 0 ; // 생성시 부모 클래스 생성자 호출 . Point3D(double x , double y , double z) : super (x , y) { this . z = z ; } // 부모의 함수를 재정의 할 수 있다 . @override int GetV () { return 2 ; } } void main () { var p1 = Point ( 2 , 2 ) ; var p2 = new Point3D ( 2 , 2 , 2 ) ; print( 'The type of a is ${p1. runtimeType } ' ) ; } 추상 클래스. 인스턴스화 되지 않는 클래스로 주로 인터페이스 정의에 사용된다. abstract class AbstractContainer { void updateChildren () ; // 추상 함수 . } class ClassA extends AbstractContainer { // 추상 함수 정의 . void updateChildren () {} } implements (인터페이스) 상속받지 않고 다른 클래스의 인터페이스를 지원할 수 있다. 여러 클래스의 인터페이스를 지원합니다.

dart (flutter) - 함수.

알림 - dart는 함수 표현법이 다양합니다.  이 문서에서는 제가 선호하는 유형만 다룹니다. 아래 3가지 함수는 동일한 동작의 함수 입니다. bool isOne (int one) { return one == 1 ; } isOne2 (one) { return one == 1 ; } bool isOne3 (int one) => one == 1 ; 보통 함수. // 호출 . int n = test( true, 1 ) ; // 정의 . int test (bool isB , int numN) { return numN ; } 이름 있는 함수. test2 (isB: true, numN: 1 ) ; test2(numN: 1 ) ; // test2(true, 1); // error // {} 로 둘러싸면 호출시 변수명을 명시해야 한다 . void test2({bool? isB , int? numN}) {} test2_1 (isB: true, numN: 1 ) ; test2_1(isB: true ) ; // error test2_1(numN: 1 ) ; // required 를 붙여주면 실행하는데 꼭 필요한 함수 . void test2_1({bool? isB , required int numN}) {} 옵션 인수 함수.   test3(true, 1);   test3();   test3(false); // [] 로 둘러싸면 호출시 인수를 입력하지 않으면 기본값을 지정해 줍니다. void test3 ([bool isB = true, int numN = 1 ]) {} forEach 에서 익명함수. var intList = [ 1 , 2 , 3 ] ; intList.forEach((item) { print(item) ; }) ; int List.forEach((item) => print(item)) ;

dart (flutter) 문법 - typedef.

// 기존 타입의 별칭을 만들수 있다 . typedef IntList = List<int> ; // 함수의 형태를 타입으로 사용 가능 . typedef Compare(int n , int m) ; bool maxLeft (int a , int b) { return a > b ; } bool compareAB (int a , int b , Compare cp) { return cp(a , b) ; } void main () { IntList il = [ 1 , 2 , 3 ] ; int a = 2 ; int b = 1 ; bool isLeftMax = compareAB(a , b , maxLeft ) ; }