dart(8)
-
최상위 Navigator와 MaterialApp, 그리고 Navigator.push()와 GetX.to()
FlutterLocalNotification 패키지를 사용해서 푸시 메시지를 터치하면, 특정 페이지로 이동하게끔 구현을 해뒀다. 문제는 사용자가 이미 특정 페이지에 진입해있을 때, 푸시 메시지를 터치하는 경우. 이 경우에는 다른 동작을 처리하게끔 만들어주고 싶었다. navigation_history_observer | Flutter Package 그래서 사용한 것이 바로 NavigationHistoryObserver. 이 친구를 사용하면 MaterialApp이 push(), pop()등을 할 때마다 내부 리스트에 route를 저장해서, 현재 어느 페이지에 위치해있는지 파악할 수 있게 된다. 매번 push()를 호출하기 위해 MaterialPageRoute를 설정하는 것은 귀찮은 일이었기 때문에, 다음과 ..
2022.07.05 -
[Flutter] isolate와 SharedPreferences, 그리고 파일에 대한 접근 2
이전에 isolate에서 SharedPreferences 패키지에 접근 시, 문제가 발생해서 파일에 데이터를 저장한 후 SharedPreferences처럼 사용하는 방법을 기재한 적이 있습니다. 당시 FirebaseMessaging.onBackgroundMessage() 함수에 넘겨준 콜백 함수가 Android에서는 isolate로 동작하고, SharedPreferences 내부 구현은 네이티브로 구현되어있는데, isolate에서 SharedPreferences에 접근이 안되는 원인을 찾지 못해서였죠. 당시에는 path_provider에서 제공하는 getApplicationDocumentsDirectory()함수를 사용해서 처리했고, 당시에는 isolate에서 파일을 읽고 쓰는 걸 확인했었습니다. [Fl..
2022.06.10 -
[Flutter/Dart] 정규표현식을 사용한 문자열 검출 및 범위값 파싱
변수를 사용한 정규표현식의 활용 이번에는 정규표현식을 활용해서 1과 0으로 이루어진 문자열을 압축하는(?) 로직을 작성해보자. 나는 데이터가 기록된 문자열에서 시간을 파싱할 때 이 방법을 사용했었다. 예를 들어서 00시부터 24시까지의 문자열이 주어진다고 치면, 전체 문자열의 길이는 144자이며 한 문자는 10분의 단위시간을 가지게 된다. 정규표현식을 사용하여 문자열이 매칭되는 시작 지점과 끝 지점의 인덱스를 알아내면, 문자열로부터 데이터가 위치한 시간을 계산해낼 수 있는 셈이다. 아무튼 오늘 해볼 것은 0과 1로 이루어진 문자열에서 match를 사용하여 시작 지점과 끝 지점을 구하고, 구간 형태의 데이터로 분리해보자. 뭐, 딱히 쓸데는 없다. ' ㅈ'; 문자열 만들기 우선은 0과 1로 구성된 문자열을 ..
2021.09.13 -
[Flutter/Dart] 확장 함수를 사용한 리스트 중복 체크
확장 함수를 사용한 리스트 중복 체크 이전에 Map에 확장함수(Extension method)를 만들어보자에서 간단하게 Map의 확장함수 fetch를 만들어서, 널 처리 및 타입 변환 등의 처리를 했었다. 이번에는 확장함수를 사용해서 배열의 중복 체크를 해보자. 결과부터 확인해보자. Dartpad에서 아래의 코드를 돌려보면 정상적으로 값이 출력되는 것을 확인할 수 있다. 간단하지만 자바스크립트로 구현했을때랑은 조금 다른데, 하나씩 살펴보도록 하자. extension ListExtension on List { bool isSameListWith(List other) { bool result = true; if (length == other.length) { asMap().forEach((index, val..
2021.09.13 -
[Flutter] Dart에서 Generic을 사용할 때, 런타임에서 타입을 확인해보자.
Dart에서 Generic을 사용할 때, 런타임에서 타입을 확인해보자. 종종 제네릭을 사용할 때 타입을 확인해야 할 때가 있다. 보통 나는 SharedPreferences나 JSONObject의 get함수 시리즈를 묶어버릴 때 사용하고는 한다. Kotlin에서는 Kotlin에서 JSONObject .get*의 확장 함수를 만들어봤다.와 같은 방식으로, reified를 사용해서 타입에 따른 분기를 처리했다. 아무래도 getString, getInt, gettBoolean등의 함수로 작성하면, 코드를 작성하다가 타입을 변경하기 영 귀찮았기 때문이다. 제네릭을 사용해서 함수를 이렇게 래핑하면 타입추론에 의지할수도 있어서, 아무래도 편리하다. 항상 타입추론을 맹신할 수는 없겠지만, 아무튼. Dart의 Type ..
2021.05.28 -
[Flutter] Provider로 비동기 통신을 하여 FutureBuilder를 대체하기
저번에 작성한 FutureBuilder에 대한 연장선에 있는 글이다. 비동기 처리에 익숙하다면 당연한 내용이기도 하다. 이번에는 FutureBuilder를 사용하여 비동기 처리를 했던 코드를, Provider로 분리하여 작성하는 방법에 대해 살펴보자. Provider를 사용하여 FutureBuilder를 대체하는 이유가 있을까? FutureBuilder를 사용해서 Widget의 초기 상태값을 결정할 때는 다음과 같은 문제점이 있다. FutureBuilder의 builder에서는 항상 비동기 처리에 대한 결과값으로, Widget을 반환해야 한다. 즉, 비동기 처리가 진행되는 동안 프로그레스 바를 띄운 뒤 다른 Widget으로 이동하려고 한다면, 렌더링과 관련해서 문제가 생긴다. 비동기 처리에 대한 로직이 ..
2021.03.25