Flutter 7

함수의 실행을 제한하자. Debounce와 Throttle

이번에 무한 스크롤이 있는 검색페이지를 만들게 되었다. 그런데, 가끔씩 스크롤을 내리다 보면 페이지를 여러개 가져와버리고, 검색편의성을 위해 넣은 자동완성은 쓸데없이 많은 api요청으로 트래픽을 증가시킨다. 그래서 비용을 조금이라도 아껴보고자 debounce와 throttle개념을 이용해보기로 했다. 성능을 향상시키거나 비용을 줄이고 싶은 경우에 debounce와 throttle이라는 개념을 이용해서 사용자의 의도와 상관없이 반복적으로 실행되는 함수의 실행 빈도를 제어를 할 수 있다. 개념 Debounce와 Throttle은 특정 함수의 실행을 제한하는데 목적을 두고 있다. Debounce는 특정기간동안 추가로 실행되지 않으면 함수를 실행한다. Throttle은 함수를 실행 하고 특정 기간동안의 추가실행..

Weekly Flutter 2023.08.17

위젯이 왜.. 다르게 보이지? 2. 이미지와 devicePixelRatio

이전글 위젯이 왜.. 다르게 보이지? 1. 해상도 이해하기 Android OS 와 iOS 는 각각 논리적 픽셀을 사용하고 있고 Flutter도 logical pixel이라는 논리적픽셀을 사용한다. 플러터에서 위젯에 주는 width와 height는 논리적 픽셀값이고 실제로 위젯이 그려지는것은 이 width, height 값과 devicePixelRatio가 곱해진 값으로 화면에 위젯이 그려진다. 플러터에서 일반적으로 사용하는 이미지는 래스터 이미지인데... 플러터에서 이미지를 사용하는 위젯을 만들때 어떻게 이미지를 넣어줘야 할까? 이미지의 종류 앱을 만들때 사용하는 이미지는 크게 래스터 이미지와 벡터이미지 2가지로 구분 할 수 있다. 컴퓨터 과학에서 래스터 그래픽스(Raster graphics) 이미지, ..

카테고리 없음 2023.07.20

WidgetsFlutterBinding.ensureInitialized 함수는 뭐하는 녀석일까?

서론 플러터 프로젝트를 진행하다보면 미리 구현된 다양한 패키지를 가져다 쓰는 것을 당연하게 여기게 됩니다. 패키지마다 나름의 구현 방식이 있겠지만, 몇몇 패키지들은 공통적으로 main 함수에서, 그리고 runApp 함수의 호출 전에, WidgetsFlutterBinding.ensureInitialized 함수의 호출이 필수적인 경우가 있습니다. 지금까지는 그저, 플러터 엔진의 어떤 중요한 부분을 '확실하게 초기화한다'라는 의미가 있겠거니 하고 필요하다니까 쓴 경향이 없지 않지만, 문득 '도대체 이게 뭔데?' 라는 의문이 들어 찾아보게 되었습니다. WidgetsFlutterBinding.ensureInitialized 함수의 역할 이 함수의 기능은 예상 했듯이, 플러터 엔진의 ..

카테고리 없음 2023.04.25

[세미나] 앱 라이프 사이클

포그라운드(Foreground) & 백그라운드(Background) 기본 개념 포그라운드와 백그라운드에 대해, 두 가지 관점에서 이야기 할 수 있습니다. 앱 상태에 따른 구분: 일반적으로, 화면에 보이는지 아니면 보이지 않는 상태에서 실행되고 있는지에 따라 각각 포그라운드와 백그라운드에 있다고 말합니다. 앱 내 특정 작업의 실행 환경에 따른 구분: 앱 자체는 포그라운드에 있더라도, 그 앱의 특정 작업은 백그라운드에서 실행된다고 말할 수 있습니다. 예를 들면, UI 관련 작업은 포그라운드에서, 데이터 처리는 백그라운드에서 실행될 수 있습니다. 앱의 상태(생명주기) Android 앱(액티비티)의 실행 상태 onCreate(): 액티비티가 생성될 때 호출되며, 초기화 작업을 수행합니다. onStart(): 액..

카테고리 없음 2023.04.13

다트의 인스턴스 복사

우리 앱의 식단 기록 기능을 구현하던 중, 깊은 복사의 중요성을 간만에 느끼게 되어 작성하게 되었습니다. List, Map 또는 클래스 안에 다른 인스턴스들을 넣어 사용할 때 리마인드 할 수 있다면 좋을 것 같습니다. 원본은 바꾸고 싶지 않다고 우리 앱의 식단 기록 기능은 다른 기록 기능들보다, 1회 기록 할 때의 데이터 크기가 큽니다. 또한, 사용자가 원하는 대로 그 데이터를 수정할 수도 있죠. 실제 식단 기록 과정을 예로 들면, 1회 식단 기록 안에는 다수의 음식 정보, 끼니 타입, 시간 등이 존재하고, 음식 정보 안에는 섭취 용량, 단위 정보 등이 존재합니다. 간식의 경우에는 이 식단 정보가 다수로 존재할 수도 있고, 기록 전에 사용자는 대부분의 정보를 조작할 수 있습니다. 사진이나 새로운 음식을 ..

Weekly Flutter 2023.03.15

[Flutter 주석 파헤치기] 03-1. Key

Flutter의 Widget을 사용할 때면 항상 마주하게 되는 것이 Key이다. Key는 다음과 같은 모습으로 처음 눈에 띄게 된다. class MyWidget extends StatelessWidget { const MyWidget({super.key}); @override Widget build(BuildContext context) { return const Placeholder(); } } StatelessWidget을 상속받을 때 생기는 template의 super.key가 바로 앞으로 살펴 볼 Key 타입의 파라미터이다. 0. Key Key 클래스의 정의는 다음 파일에서 찾을 수 있다. .../flutter/lib/src/foundation/key.dart abstract class인 Key에..

Weekly Flutter 2023.03.01

[Flutter 아는 척하기] 플러터 선택의 이유

왜 Dart일까? 정적 컴파일, 동적 컴파일 체리픽 프로그램 실행 방식 정적 컴파일 방식: AOT(Ahead Of Time), Static Compilation 정적인 방식이다. 실행 전에, 고급 언어의 명령어들을 컴파일러를 통해 기계어나 중간 언어로 변환한다. 변환된 기계어를 실행한다. 장점: 실행 속도가 빠르다. 컴파일 과정중에 성능 최적화가 가능하다. 단점: 컴파일 과정의 시간이 오래 걸린다. 예시: C/C++, Java, 인터프리터 방식: JIT(Just In Time), Dynamic Interpretation 동적인 방식이다. 실행 중에, 고급 언어의 명령어들을 한 번에 한 줄씩 인터프리터를 통과시켜 중간 언어로 변환한다. 한 줄의 명령어가 변환되면 바로 실행한다. 장점: 빠르게 수정하고 테스..

Weekly Flutter 2023.02.15