Flutter 에서 Parent Widget 강제로 Update 하는 방법

Flutter 에서 이런 경우가 종종 있다. 홈 화면에서 버튼을 터치하면 기능화면으로 이동한다. 홈화면과 기능화면에 각각 포인트의 상황을 나타내는 텍스트가 있다. 기능 화면에서 포인트를 하나 감소 시킨다. 기능 화면 상단의 돌아가기 버튼을 터치하면 홈화면의 포인트로 감소된 상태로 보여야 한다. 하지만 홈 화면의 포인트는 감소 전의 상태로 보인다. parent widget update 로 검색해도 뻘소리만 나온다. 나의 해결 방안은 이렇다. 기능화면에서 버튼 터치를 홈 화면으로 전달한다. 홈 화면에서 전달된 버튼 이벤트의 로직에 포인트 감소를 처리한다. 기능화면 소스는 이렇다 class DangYoungPage extends StatefulWidget { const DangYoungPage ({ super . key , required this .onClosed}); final Function ( bool ) onClosed; @override State < DangYoungPage > createState () => _DangYoungPageState (); } 선언은 이렇게 해야 부모 위젯에 이벤트를 전달할 수 있다. AppBar ( title : Text ( 'dangYoung' . tr ()), backgroundColor : Theme . of ( context ).colorScheme.inversePrimary, centerTitle : true , automaticallyImplyLeading : true , leading : IconButton ( onPressed : () { widget.onClosed( true ); Navigator . pop ( context ); }, icon : const Icon ( Icons .arrow_back), ), ), Scaffold 앱 바의 내용을 변경하고 여기 이벤트를...

비침습 혈당 측정에 관하여

아침에 일어나면 바늘로 손가락을 찔러 피 한방울을 매일 본다. 오늘 이 피 한방울은 나에게 어떤 결과를 줄까 하면서 말이다. 정상 수치내로 결과가 나오면 어제는 잘 살았구나라는 안도감으로 수치가 높게 나오면 어제 반성하면서 자책으로 하루를 시작한다. 매일 바늘로 손가락을 찌르는 고통도 작지만 싫다. 어차피 혈액내 포도당 농도를 측정하는 것이므로 다른 방법이 있을 것이다. 애플이 지난 10년간 수백명 대상으로 실험 했다는 뉴스가 있다. 자본과 기술력도 있는데 10년에 고작 수백명이 뭔가 이 수치로 유의미한 결과가 나올까? WWDC 2023 에 해당 기능이 애플워치에 탑재될 거란 루머만 돌았다. 결국 발표내용엔 없었다. 혹시나 하여 알리 익스프레스에 무채혈 혈당 측정을 검색했더니 많은 제품들이 나왔다. 가격은 대략 3만 ~ 15만원 정도 스마트워치였다. 그중 5만원대가 가장 많이 팔리고 있었다. 어차피 아침마다 측정하는데 이거 구매해서 어느정도 정확도가 나오는지 확인해보아야겠다. 정확도를 떠나서 이런 제품을 내서 팔 수 있는 환경이 부럽다. 사용자들이 많아질수록 제품은 더 좋아질 것이고 기술은 발전한다. 이미 우리 앞에서 뛰고 있는 걸 바라만 보는 것 같아 착잡하다.

node 에서 apns 푸시 메시지를 Slient 로 보내는 방법

노드에서 아이폰으로 사일런트 푸시를 보낼 때 방법이다. 나 같은 경우는 수면 알람을 깨우는데 사용한다. 버전은 apn 2.2.0 을 사용했다. 이 버전이 노드 16 이상을 요구해서 노드를 업그레이드 했다. 먼저 선언을 한다. const apn = require ( ' apn ' ); 그런 다음 보내기 위한 옵션을 설정한다. var options = { token : { key : " ./AuthKey_XXXX.p8 " , keyId : " XXXX " , teamId : " XXXX " }, production : false }; var apnProvider = new apn. Provider (options); 수면 알람이 분단위로 측정되기 때문에 매분마다 수행하는 루틴을 작성 후  그 안에 로직을 추가하였다. setInterval ( async function () { let notification = new apn. Notification (); notification.topic = " 앱 번들 아이디 " notification.priority = 5 notification.pushType = " Background " notification.rawPayload = { aps : { " content-available " : 1 }, acme1 : " bar " , acme2 : 42 } apnProvider. send (notification, i.token). then (( result ) => { console . log ( JSON . stringify (...

Flutter 에서 수면 알람 기능 제작

 기존에 만들어 놓은 앱이 있다. 안드로이드 코틀린으로 아이폰 스위프트로 작성하였다. 이를 수정하기로 하였다. Flutter 로 작성해서 개발 공수를 줄이자고 결정했다. 다른 화면은 모두 순조롭게 구현이 되었지만 알람 기능이 문제였다. flutter package 에 alarm 이 있다. 이를 적용하고자 했으나 추가하면 오류가 났다. 깃헙에 이슈에 등록해도 클린 후 다시 적용만 하라고 했는데 개발자 중에 그걸 안하고 이슈에 올릴 사람은 적을 것이다. 이후 답변이 없고 마냥 기다릴 수 없어서 다른 패키지를 검색했다. flutter_local_notification 패키지를 이용하는 것이다. 안드로이드를 대상으로 하니 잘 된다. 문제는 아이폰에서 음원 반복이 되지 않았다. 아침에 깨워주는 기능인데 30초 음원으로 만들어서 등록해도 30초만 플레이 되는 문제가 발생되었다. 이를 해결하고자 아이폰 알람은 직접 제작하기로 했다. 메소드 채널이란 기능을 이용하면 플러터에서 스위프트 함수를 호출할 수 있다. 스위프트로 로컬 노티피케이션 기능을 활용하여 알람을 구현하였다. 앱이 켜져 있는 상태인 Foreground 에서 알람 기능은 잘 작동하였다. 하지만 꺼져 있는 상태인 Background 에서는 잘 작동하지 않았다. 아침에 알람이 30초 동안만 울린다. 음원 반복재생이 되지 않았다. 백그라운드 패치를 이용해서 매분마다 체크를 구현하다가 너무 이건 아닌가 싶어 포기했다. 푸시 기능을 활용하면 didReceiveRemoteNotification 에서 이벤트를 잡을 수 있다. 나머지 이벤트는 알람창을 터치하면 뜨는 이벤트이다. 고로 알람 시간을 추가하면 서버에 토큰과 시간을 등록하고 그 시간이 되면 서버에서 Slient Push Message 를 보낸다. 앱은 알람을 즉시 작성해서 창을 띄우고 음원을 반복재생한다. 이런 구성으로 구현하니 잘 작동된다.

Flutter 에서 Alarm 모듈 사용하기

일단 Alarm 이 안드로이드 와 아이폰 작동방식이 다르다. 양쪽 다 지원하려면 모듈을 사용해야 한다. 먼저 alarm 1.0.3 모듈이 보인다. 이를 적용하려고 보니 오류가 난다. 깃헙에 이슈 사항에 올렸는데 해결했는지 모르겠다. 좀 더 찾아보니 flutter_local_notification 13.0.0 이 나온다. 이 모듈이 좀 더 안정적이다. 샘플 코드가 너무 복잡해서 난해하다. 하나씩 해보니 되긴 된다. 사운드를 기본 음에서 변경할 때 매뉴얼 대로 했는데 되지 않는다. 채널 아이디를 테스트 할 때마다 변경하거나 앱을 삭제 한 후 해야 한다. 매뉴얼에 영어로 한줄 있었는데 간과해서 몇시간을 고통 속에 있었다.

Flutter 에서 confetti 사용할 때 Fatal signal 5 오류 조치 방법

이미지
Flutter 에서 Confetti 를 사용하면 축하 애니메이션을 만들기 쉽다. 안드로이드에서만 아래와 같은 오류가 난다. Confetti 를 play 하면 오류가 나는데 안드로이드에서만 난다. 아이폰과 웹에서는 오류가 나지 않는다. 관련 자료를 검색해도 나오지 않는데 이곳에서 이런 논쟁이 있었다. https://github.com/funwithflutter/flutter_confetti/issues/78 뭐 대충 보면 Flutter 버전을 올리면 되는거 같다. 현재 나의 Flutter 버전을 확인 해본 결과 이전 버전으로 나왔다. 비주얼 코드의 마켓 플레이스에서 설치했는데 이게 최신이 아닌가 보다. 일단 아래에서 권장 한대로 명령어를 실행해보았다. https://docs.flutter.dev/development/tools/sdk/upgrading $ flutter upgrade  현재 버전에서 더이상 할게 없다고 나온다. $ flutter channel 여러개가 나온다. 여기서 나는 main 으로 변경했다. $ flutter channel main $ flutter upgrade 업그레이드가 된다. 이후 실행해보니 오류가 나지 않는다.

모바일 앱 개발 언어 선정할때 검토사항

모바일 앱을 개발할 때 언어를 선택해야 하는 경우가 많습니다. 일단 저는 아이폰 개발을 시작으로 안드로이드로 확장된 경험을 가지고 있습니다. 아이폰은 Objective-C 부터 Swift 그리고 SwiftUI 까지 개발한 경험을 가지고 있습니다. 안드로이드는 Java 부터 Kotlin 그리고 Jetpack Compose 까지 개발한 경험을 가지고 있습니다. 아이폰으로 먼저 화면과 기능을 구현한 다음 안드로이드를 구현하는 방식으로 개발했습니다. 왜냐하면 아이폰이 저에게는 더 익숙한 환경이었거든요. 아무래도 조건이 더 까다로워서 이것부터 맞춘 다음 안드로이드 하면 더 쉬운 느낌이었으니까요. 이런 작업을 하다 보면 같은 작업을 반복한다는 생각이 많이 듭니다. 개발 도중 현타도 많이 옵니다. 이게 뭐하는 건지....., 그래서 시도한 방법은 KMM(Kotlin Multiplatform Mobile) 적용이었습니다. 이것도 굉장한 물건입니다. 공통 모듈로 뺄 수 있는 부분이 내부 데이터베이스와 API 호출 하는 모듈을 작성하였습니다. 이것만 되어도 굉장한 코딩 중복이 사라집니다. 큰 앱은 이방법을 사용하시면 됩니다. 각 디바이스 마다 적용해야 할 제약이 크다면 이정도만 해도 굉장한 중복제거 효과를 볼 수 있습니다. 만약 좀 더 나아가서 기획 쪽까지 틀 수 있는 정도면 Flutter 를 추천합니다. 저도 사실 예전에 Flutter 시도를 했었다 실패한 경험이 있습니다. 아직도 camera 부분이나 machine learning 부분 등이 버전이 1.0대가 아니어서 많이 느리지만 그래도 구현은 됩니다. Flutter 로 개발하면서 느낀 점은 아이폰과 안드로이드 설정은 똑같이 해야 한다는 점입니다. 그래들과 info.plist 등 설정이 필요합니다.