목록전체 글 (245)
말랑한 하루
이번 칼럼은 배포 전 해야 할 일에 대해서 작성하겠다. 개인적으로 준비한 프로젝트이며, 실질적으로 appbundle을 준비하는 것 이외의 모든 부분이 개발자 밖의 영역이라고 생각되고, 또 그렇게 진행되는 모습을 알아갈 수 있었다. 하지만, 앱 출시를 준비하고 등록하는 모든 과정을 직접 경험해봐야 한다는 생각에 이 글을 준비했다. 물론 모든 내용을 전달해 드릴 순 없지만, 큰 문제 없이 진행되는 모습을 알려드리려 한다. 문단 첫 마디에 사용된 아이콘의 경우 🐇 🥕 🍒 🍇 🍎 🍌 순서이므로, 글의 흐름에 영향을 크게 미치진 않지만 토끼나 당근이 보인다면 새로운 문단이 시작됨을 알아주셨음한다. 또한, 이 글은 내 개인적으로 배포 전 해야할 일에 대해 정리하여 지속적으로 확인하기 위한 것이다. 🐇 프로젝트 이름..
모든 예외를 처리했다고 생각했으니, 앞으로의 개선사항과 오류 및 버그사항은 앱 테스트가 실질적으로 이루어질 때 진행하려 한다. 그래서 이번 시간에는 정상적으로 apk가 만들어지는지 실제 폰에선 잘 다운로드하여 작동하는지 검증하는 시간을 가지려 한다. 🐇 Build mode 🥕 성능분석 profile mode 🥕 출시 준비 release mode 최대 최적화 및 최소 설치 공간 크기를 원하는 경우 앱 배포를 위해 사용합니다. 모바일의 경우 릴리즈 모드는 다음을 의미합니다.(에뮬레이터에서는 지원되지 않음) 🍒 Assertion이 비활성화 되었습니다. 🍒 디버깅 정보가 제거되고, 디버깅이 비활성화 됩니다. 🍒 컴파일은 빠른 시작/실행 및 작은 패키지 크기에 최적화되어 있습니다. 🍒 서비스 확장이 비활성화 되었..
🥕 navigator key 사용 그렇게 모든 로직을 Contorller로 옮겼을 때, 우리는 Notifier에 의해 ref를 자유자재로 사용할 수 있지만 Widget의 context를 사용하려면 매개변수로 넘겨주어야 한다. 하지만 이런 경우, 코드 간 응집도가 높아질 수 있기 때문에 다른 방법을 찾고 싶었다. 그 중 한 방법이 GoRouter의 navigatorKey를 사용하는 것이다. GlobalKey로 GoRotuer에 navigatorKey를 설정하면 key의 currentContext를 통해 가장 최근의 context를 가져올 수 있고, 그 context로 go/push 행위를 진행할 수 있다. 사용은 다음과 같다. GlobalKey navigatorkey = GlobalKey(); GoRout..
🥕 notifier 안에 stateProvider로 사용자 흐름 제어하기 입력 받은 텍스트에 대해 유효성 검사를 진행 한 후에, 모든 결과를 만족하면 다음 페이지로 넘어가도록 설정해주는 작업을 해야 했다. 그러기 위해서 현재 http request를 진행 중인지, Response는 무엇인지, Error는 없는지 확인해야 했다. 그래서 http 통신을 위한 fetch 기반 AsyncNotifier에서, 현재 페이지의 여러 상태들을 관리하기 위한 Notifier를 Controller 형식으로 설계하여 UI와 로직을 분리하기 위한 노력을 했다. 현재 진행 중인지를 나타내는 isLoading, 에러가 있는지 확인하는 hasError, 에러가 존재하는 경우 사용자를 위한 문구를 제공하는 errorMessage 등..
🥕 DioException 예외 처리 사용자의 닉네임이 정확히 입력되지 않은 경우, 서버에서 BadResponse, error 400 code를 보내왔다. 그래서 DioException의 error.type에 대한 모든 분기 처리를 진행했으나, 위 오류가 DioException으로 반환되는 것이 아닌 assureDioException을 타고 외부에서 에러를 throwing하고 있었다. 어떻게 해결해야 하나 엄청난 서칭 끝에 git issue에 등록된 글로 해결할 수 있었다. 가장 중요한 내용은, dio에서 전달받는 status code에서 성공하는 코드를 제외하고 나머지 에러는 인터셉터를 활용하여 DioException으로 보내버리는 행위를 해버리면 된다. dio의 상태에 대한 저장과, 인터셉터를 구현하..
🥕 TextFormField가 focus에서 focusout 상태가 됐을 때, validator 호출 일단 validator를 호출하기 전에 TextFormField에서 focusout 상태를 만드는 것이 중요하다. 앱 키보드는 뒤로 가기, 또는 done을 눌러야 키보드가 사라지는데 보통의 사용자는 화면의 빈 부분을 클릭하여 focus를 해제하려 한다. ※ reference : https://api.flutter.dev/flutter/widgets/FocusScope-class.html FocusScope class를 활용하면 Widget에 대해 unfocus를 진행할 수 있다. 두 요소를 결합하여, 전체 화면을 GesturDetector로 감싸주고 배경이 클릭 됐을 시, unfocus를 위한 metho..
🥕 TextFieldForm 아이디에 영문, 숫자, 한글을 제외하고 입력되지 않기 때문에, 정규 표현식 조건을 걸어주려 한다. 하지만 기존 TextFiled의 경우, controller에 들어오는 값에 대해 실시간으로 감지하고 오류 텍스트를 띄워주어야 했기 때문에, 예외 처리를 진행하는 동안에는 개발 비용이 비싸다고 생각했다. 그래서 TextFiled Widget을 FormFiled로 Wrapping하는 TextFiledForm Widget을 활용했다. 사용 방법은 다음과 같다. TextFormField( decoration: const InputDecoration( icon: Icon(Icons.person), hintText: 'What do people call you?', labelText: 'N..
테스트를 진행하면서 예외 처리 작업 시 겪었던 내용을 적어 내려가려 한다. 작업을 진행하기 전, 테스트 항목에 대해 모두 기술하고, 그것을 기반으로 진행하면서 차근차근 변경하려 한다. 🥕 정보가 입력되지 않았을 때, 검색을 클릭하는 경우 TextFiled로 포커싱 ※ reference : https://docs.flutter.dev/cookbook/forms/focus 방법은 TextFiled에 autofocus 속성을 true로 설정하고, FocusNode class를 생성하는 것입니다. 그러면, 버튼을 클릭했을 대, FocusNode의 requestFocus method를 활용하여 강제로 TextFiled에 focusing할 수 있습니다. 자세한 예제는 reference를 참고해주세요. 🥕 페이지를 ..