일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jszip
- userevent_tracker
- Babel standalone
- uint16array
- three.js
- methodChannel
- Image Resize typescript
- KakaoMap
- webrtc
- Raycasting
- Three js
- uint8array
- typescript
- RouteObserver
- Excel
- react
- Prism.js
- Three-fiber
- androidId
- identifierForVender
- code editor
- REST API
- babel
- Game js
- swagger-typescript-api
- Flutter
- Redux
- Completer
- web track
- node
- Today
- Total
목록분류 전체보기 (123)
Never give up
소스코드를 찾다보면 abstract class를 상속받을 때 어떤 곳에서는 extends, 다른 곳에서는 implements로 되어있습니다 필자는 C로 입문 후 자바 => 다트로 넘어갔었던 케이스라 당황했었습니다 필자가 이것을 처음봤을 때의 반응 : abstract class 상속할때는 extends, interface는 implements 아니었던가? 뭐지? (참고로 Dart는 interface가 없습니다) 두 방식의 차이는 extends는 override해서 재정의 하는 함수 제외하고 따로 정의를 해주지 않아도 되고 implements는 모든 메소드를 재정의 해줘야됩니다 따라서 본인이 메소드 이름(기능)만 정의 해놓고 자식 클래스에서 기능을 정의 할 때는 implements를 그 외에는 extends..
Flutter앱을 만들고나서 AVD가 아닌 기기에서 실행해보면 반응 및 애니메이션이 엄청 버벅거리는것을 확인 할 수 있습니다 처음 했을때 필자의 반응은 "?? 네이티브급 성능이라 하지 않았던가? 뭐지 이건?" 이랬습니다 그런데 debug모드와 release모드, profile모드를 알고는 있었는데 기기를 연결하고 Run을 누르면 debug모드가 default인것을 모르고 있었기 때문에 애니메이션 최적화를 잘못한줄 알고 코드만 열심히 봤었습니다(하..씁..) 이랬던 이유중 하나가 분명 AVD에서는 Run눌러도 랙 없이 잘 동작했었고 네이티브 안드로이드 했었을 때 Run으로 실행했고, 잘 작동됐었던 기억이 있었습니다 그래서 찾아보니 flutter 앱은 기기에서 debug모드는 상당히 느리다는것을 알 수 있었..
ListView를 사용할 때 순서를 바꿔야될 때 ReorderableListView를 사용하는데 children 부분이랑 onReorder부분을 처리하는게 생각보다 까다롭습니다 그래서 어떻게 하면 간단하게 할 수 있는지 알아보겠습니다 메인 class Reorderable extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('ReorderableListview example')), body: Consumer( builder: (context, value, child) { return ReorderableListView( onReorder: (int o..
앱개발을 하다보면 List를 DB에 저장해야할 때가 있습니다 List같은 경우 SharedPreferences에 저장하는 방법도 있지만 key값을 갖는 Map같은 경우 ex) Map SQFLite를 통해 DB에 저장하거나 Batch파일에 저장해야됩니다 여기에서는 SQFLite를 통해 저장하는 방법을 알아보겠습니다 먼저 제가 사용한 데이터 타입은 Map입니다 void setTodayData(DateTime time, List list) async { //Map _map = {}; //_map[time] = list; //notifyListeners(); //윗 부분은 UI에 표시하는 부분이어서 다른형태로 사용하셔도 무방합니다 String data = jsonEncode(list); //DBManager _..
GuestureDetector를 이용하여 스케일 변경을 할 때 몇가지 주의해야될 점이 있습니다 예를 들어 위젯 사이즈가 화면 사이즈보다 크면 overflow가 발생할 수 있고 너무 작으면 위젯들의 글씨가 안좋아서 가독성이 떨어질 수 있습니다 해결방안으로 여러가지가 있겠지만, 해당 글에서는 clamp를 사용할 것입니다 class ScaleExample extends StatefulWidget { @override _ScaleExampleState createState() => _ScaleExampleState(); } class _ScaleExampleState extends State { double size = 100; @override Widget build(BuildContext context) {..
Provider를 사용할 때 Provider.of, Consumer, Selector등을 사용할 수 있는데 Provider.of에서는 listen을 제외하고는 크게 고려할것이 없습니다 (자세한 내용은 링크를 통해 확인해주세요 : https://devmemory.tistory.com/10) 그러면 Consumer와 Selector는 언제 쓰는것이 좋은지에 대해 알아보겠습니다 먼저 Consumer를 사용하는 가장 큰 목적은 크게 2가지로 1. BuildContext가 없는 곳에서 사용하기 용이 2. 최적화된 리빌드를 통한 성능적 이득 그러면 Consumer 대신 Selector를 사용해야 될때는 언제일까요? 먼저 Consumer랑 Selector의 기능은 동일합니다만 Selector에는 다른 기능이 있습니다..
공식문서에 따르면 SQFLite에 데이터를 저장하고 불러올 때 Data type은 다음과 같습니다 // Get the records List list = await database.rawQuery('SELECT * FROM Test'); List expectedList = [ {'name': 'updated name', 'id': 1, 'value': 9876, 'num': 456.789}, {'name': 'another name', 'id': 2, 'value': 12345678, 'num': 3.1416} ]; (출처 : pub.dev/packages/sqflite) 먼저 Map은 key와 value의 관계로 되어있고, List는 index와 value의 관계로 되어있습니다 그리고 List은 val..
기본적으로 SQLite에서는 NULL, INTEGER, REAL, TEXT, BLOB형태로 저장이 됩니다 NULL은 데이터 값이 비어있을때 INTEGER는 정수형 (int value, DateTime, bool 등) DateTime의 경우 INSERT할 때 DateTime.millisecondsSinceEpoch 값으로 저장 후 불러올 때는 DateTime.fromMillisecondsSinceEpoch(value)과 같은 형태로 불러옵니다 ex) 데이터 클래스 void setTodayData(DateTime time, int percent) async { _map[time] = percent; notifyListeners(); await _manager.setStatus(time.milliseconds..