일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- vscode
- 맥
- linux
- 책
- 명령어
- python
- command
- 유데미 러닝크루
- ExpansionTile
- dart
- 다트
- 플러터
- 디자인패턴
- copyWIth
- 가상환경
- 도서
- 프로그래밍
- 파이썬
- flutter
- freezeD
- 유데미
- Code Generation
- 리버팟
- riverpod
- 코딩
- ListTile
- 개발
- 유데미 코리아
- 개발자
- 리눅스
- Today
- Total
목록flutter (22)
승상의 코딩 블로그
extension 을 활용하면 기존 클래스나 타입에 새로운 기능을 추가할 수 있다.기존의 클래스를 수정하지 않아도 된다. int.parse("3") 은 flutter(dart) 에서 문자열을 정수에서 변경하는 방법이다.하지만 문자열에서 숫자로 더 간결하게 변경할 순 없을까?예를 들어, "3".toInt() 와 같이 말이다. 하지만 "3" 은 String 타입이고, String 클래스에는 정수로 변경하는 함수가 없다.이렇게, 기존 클래스에다가 기능이 추가되었으면 할 때 extension 을 활용하면 좋다. 사용예시 extension 의 이름(위에서 StringExtension)은 생략해도 된다.그러나 extension 에 이름이 있어야 라이브러리나 API 를 사용시 생기는 충돌을 해결할 수 있다.(다른 e..
왜 불변 객체을 써라고 하는 것일까?* 불변 객체만 쓰라는 것은 아니다. 대부분의 경우에 장점이 많기 때문이다* 대부분의 경우에서 불변 객체의 단점을 장점이 상쇄시킨다.불변 객체를 사용하면 외부에서 의도하지 않은 수정으로부터 객체를 보호할 수 있다.코드는 한 사람만이 개발하는 것이 아니다.즉, 내가 구현한 객체가 의도치 않게 외부에서 수정될 수 있다.데이터와 로직의 흐름을 파악하기 쉽다.데이터가 변경이 일어날 경우, 이를 추적하면 코드를 파악하는 것은 쉽지 않다.데이터가 불변이 아니라면, 데이터가 변경이 되지 않았음을 계속해서 파악해야한다.자신이 코드를 작성할 경우에는 로직을 정확히 파악하고 모든것을 컨트롤 할 수 있다고 생각할 수 있다.(내가 처음에 이랬다)그러나 개발하는 시스템이 복잡해지고 시간이 지..
복사에는 얕은 복사(shallow copy)와 깊은 복사(deep copy)가 있다.얕은 복사얕은 복사는 객체의 참조값만 복사한다.(원본 객체와 동일한 메모리 주소값을 참조하는것이다.)즉, 데이터를 "공유"하는 것이다. 위 코드는 얕은 복사에 대한 예시이다.데이터를 공유하기 떄문에 x 객체의 값을 변경하였는데, y 객체의 값도 변경되었다. 얕은 복사는 메모리 데이터가 공유되기 때문에 메모리를 절약할 수 있다.하지만, 일반적인 프로그램에서는 메모리 부족에 대한 문제를 겪기 힘들것이다.복잡한 프로그램이라면 데이터의 독립성을 보장하여 사이드 이펙트(버그)가 생기지 않도록 하는것이 더 효과적이다.깊은 복사깊은 복사를 사용하면 객체의 값 자체를 복사하여 독립적인 객체를 만들 수 있다.깊은 복사는 객체를 다시 ..
몇 개의 간단한 페이지 있다면 네비게이션(화면이동)을 정리할 필요가 없습니다.그러나 앱의 다양한 곳에서 같은 페이지에 접근해야 한다면, 페이지의 이름을 정의하고 정리하는 것이 효율적일 것입니다.💡 DeepLink 의 문제(ex. 웹 링크를 눌러 어플로 라우팅) 로 인해, Named Route 를 사용하는 것을 추천하지 않는다고 합니다. 그러나 단순 앱내서 앱내로의 이동에 사용하는 경우는 유용합니다. https://docs.flutter.dev/cookbook/navigation/named-routes Navigate with named routesHow to implement named routes for navigating between screens.docs.flutter.dev구현HOME 과 S..
어떤 폰트를 사용하느냐에 따라 어플의 가독성이 달라진다.폰트는 감정이나 분위기를 전달하는데 사용될 수 있다.더 나아가 상품이나 브랜드의 아이덴티니를 형성시켜주는 요소로써 활용할 수 있다. 플러터에 폰트를 추가해서 적용해보자.폰트 다운 및 추가 방법1. 아래 링크(구글 폰트)에서 폰트를 다운 받습니다.https://fonts.google.com/ Browse Fonts - Google FontsMaking the web more beautiful, fast, and open through great typographyfonts.google.com 저는 Noto Sans 폰트를 다운 받았습니다. 2. 플러터 프로젝트에 assets/fonts 를 만든 뒤, 다운받은 폰트중에 사용할 폰트(.ttf) 를 복사합..
https://riverpod.dev/docs/providers/future_provider FutureProvider | Riverpod The content of this page may be outdated. riverpod.dev FutureProvider 는 Async 한 코드를 처리하기 위한 Provider 의 한 종류이다. (외부에서 상태를 제어한다면, AsyncNotifierProvider 를 사용하면 된다.) FutureProvider 는 아래의 상황에서 사용하기 좋다. 네트워크 요청 같은 비동기적인 동작을 하거나 데이터를 캐싱 할 때 (네트워크 요청을 다시 하지 않도록 값을 저장함) 비동기 동작의 상태를 핸들링할 때 (error, loading, success) 여러 비동기 값을 다른..
https://riverpod.dev/ko/docs/providers/state_provider StateProvider | Riverpod StateProvider is a provider that exposes a way to modify its state. riverpod.dev StateProvider 는 State(상태)를 변경을 지원해주는 Provider 의 한 종류이다. StateNotifer 를 작성하지 않아도 되는 StateNotifierProvider 의 단순화된 형태의 Provider 라고 생각하면 된다. 단순함이라고 하면 어떤 정도의 단순함을 의미하는 것일까? Riverpod 의 공식문서에 따르면 아래 상황에 StateProvider 사용을 추천한다. 필터링을 위해 사용할 Enum ..
필요할 때만 접근하기 위한 정보들은 Drawer 라는 공간에 위치시킨다. 이 공간에는 계정정보 등을 시현할 수도 있고, 특정 페이지로의 네이게이션이 가능하도록 정보를 추가할 수 있다. https://docs.flutter.dev/cookbook/design/drawer Add a drawer to a screen How to implement a Material Drawer. docs.flutter.dev 구현 Drawer 도 네비게이션 스택에 추가된다. 그러므로 Drawer 를 닫을 때, Navigator.pop(context) 을 사용한다. Expansion 위젯은 아래 링크를 참조하길 바란다. 2023.12.26 - [Flutter (플러터)] - [Flutter] 목록 펼치기 (서브 카테고리 만들..
한번에 페이지에 시현되는 정보가 너무 많으면, 원하는 정보를 찾기도 어려워 사용자에게 피로감을 주는 문제가 있다. 이러한 문제는 상위 카테고리를 만들어 각 항목들을 묶어줌으로써 개선할 수 있다. 카테고리로 묶어주는 보편적인 방법에는 드롭다운이 있다. 플러터에서는 ExpansionTile 을 사용하여 드롭다운 형태로 카테고리를 분류할 수 있다. https://api.flutter.dev/flutter/material/ExpansionTile-class.html ExpansionTile class - material library - Dart API A single-line ListTile with an expansion arrow icon that expands or collapses the tile to..
class Person { late String name; late int age; // Unnamed Constructor 는 하나만 생성 가능하다. Person(this.name, this.age); // Named Constructor Person.fromJson(Map data) { name = data['name']; age = data['age']; } } Unnamed/Named Constructor C++ 와 다르게 Dart 에서는 클래스의 이름을 가진 생성자(Constructor)는 하나만 존재할 수 있다. 추가로 Constructor 를 만들고 싶다면 Named Constructor 를 이용하자. (단, Named Constructor 는 상속되지 않으니 참고하길 바란다.) Named ..