GDG in songdo
플러터 사이드 팀프로젝트가 끝나고

지금까지 약 한달 가량

 

혼자 프로젝트를 진행했다.

팀프로젝트에서는 디자이너 개발자가 각각 포지션에 맞는 역할에 집중해서 수행하면됬는데

혼자 하다보니.. 많은 어려움이 있었다.

UI 쪽으로 많은 신경을 쓰는 난.. 디자인 작업에 많은 시간을 썻던것같다.

사실 처음엔 10정도의 퀄리티를 갖는 앱을 구상했지만 내 욕심에 점점 기능은 추가되었고

구현하는 과정에 있어 많은 시간이 더 소요됐다.

 

사실 앱만 보면 별 기능 없다...

어떤 사람에겐 일주일이면 뚝딱 만들 앱이지만

초보인 나에겐 한달정도 걸린것이다.

 

더 많은 기능을 추가하고싶었는데

앱 출시를 더 미룰 수 없기에 그만 개발하고 출시했다.

앱 출시 만큼 중요한 포트폴리오는 없다고 생각했기 때문이다.

 

개인적으로 아주 만족스러운 앱이다.

첫 배포 앱인데 디자인적이나 기능적이나 현재 나에게 딱 맞는 수준인것 같다.

 

다음 앱은 뭘 만들면 좋을지 고민이 되면서

이제는 취업을 하여 빡시게 배워보고싶은 마음도 있다.

 

https://apps.apple.com/kr/app/task-us/id6445977626

 

‎task/us

‎직관적인 UI와 최소화된 기능들로 빠르고 효율적으로 일정을 관리하세요.

apps.apple.com

https://play.google.com/store/apps/details?id=com.taskus.taskus&pli=1 

 

쉽고 간편한 일정 관리 앱(task/us) - Google Play 앱

최소화된 기능으로 쾌적하고 빠르게 일정을 관리하세요

play.google.com

'코딩 > Flutter_miniproject' 카테고리의 다른 글

[Migration] Todo App  (0) 2024.02.19
[Mini_project] pomodoro TIMER  (0) 2022.12.27

드디어 앱을 완성? 시키고 출시를 진행중이다.

안드로이드와 IOS 모두 현재 심사중이며

제발 무사히 통과되길 바란다...

 

양 플랫폼 모두 공식 문서를 보면 쉽게 출시 가능하다.

개인정보처리방침이 조금 어렵다...

대충 적었는데 잘될진 모르겠다.

 

IOS 출시 진행중 오류가 하나 있어 해결법과 같이 소개하려고한다.

기본적인 셋팅을 마치고 나면

Product. - Archives 하게 되는데

진행중에 Invalid App Store Icon. 이란 오류가 발생했고

뜻을 해석하면 아이콘 이미지에 알파채널이 들어가 있어 문제가 발생한거 같다.

그럼 해결해보자

먼저 아이콘 파일들이 들어있는 폴더에 가보자.

your project/ios/Runner/Assts.xcassets/Appicon.appiconset/
에 들어가면 아이콘 이미지들이 여러개 있는데

우리는 이 중 1024*1024파일만 만져주면된다.

 

해당 파일을 더블클릭으로 열어준뒤

작업바 에 파일 - 내보내기를 누르면

알파에 체크가 되어있다 이걸 풀어주고

저장한뒤 기존 파일에 덮어씌우면 끝!

 

 

 

 

 

 

 

이제 다시 Archives 해주면 성공적으로 업로드 될것이다.

정말 몇 가지 남지않았다.

그래서 주위 사람들에게 테스트겸 배포하고자 apk 파일을 만들어 뿌려보았다.

다행인지 주위에 안드유저가 좀 있다.

 

apk 파일 빌드는 아래 명령에로 하면 바로된다.

flutter build apk --release --target-platform=android-arm64
flutter build apk --debug --target-platform=android-arm64

 

release 와 debug의 차이점에 대해 간략하게 설명하면

 

release  -  디버깅 및 런타임 오류 보고 기능 비활성화, 앱 사이즈가 작음

debug - 디버깅 및 런타임 오류 보고 기능 활성화, 앱 사이즈가 큼

본인의 상황에 따라 선택해서 빌드하면된다.

 

명령어를 실행하면 파일이 저장된 경로가 보여진다.

 

지난번 Hero위젯을 이용해 popup Container를 구현했다. 

 팝업이 뜨고 다시 닫았을때 오른쪽 하단 시계 텍스트가
조금 깨지는 것을 볼 수 있다.

이런 디테일이 너무 신경쓰여서

계속 고민을 해보다 오늘 결국 해결에 성공했다.

 

 

 

 

 

 

 

 

 

방법은 아주 간단했다.

예를 들어

 A 위젯 <---> B 위젯

Hero을 적용시켯다고 하면

나는 페이지라우터를 이용하여 구현했기 때문에

B위젯의 컨테이너를  Material으로 한번 감싸줬다.

따라서

 A 위젯(Material X)<---> B 위젯(Material O)

왔다갔다하니 UI 엔진에서 문제가 생긴듯하다 (내 생각 ㅎㅎ)

 

A 위젯에도 Material로 한번 감싸주니 해결 완료됐다.

솔플 사이드 프로젝트가 이제 거의 마무리되가고있다.

기능적으로는 구현이 완료가 되었다...

물론 넣을 기능은 많지만 이러다간 출시하지 못할꺼 같아서 우선 여기서 스탑하기로 했다.

 

가장 집중해서 고민한 부분이 바로 로고 작업이였다.

상업적으로 사용가능한 아이콘을 찾고

편집하는 과정이 힘들고 어려웠다,,,,

내가만든 로고를 앱에 넣으니 아주 그럴싸해졌다.

 

이제 Launcher Icon을 쉽게 변경하는 법을 소개하겠다.

 https://pub.dev/packages/flutter_launcher_icons

 

flutter_launcher_icons | Dart Package

A package which simplifies the task of updating your Flutter app's launcher icon.

pub.dev

해당 라이브러리를 이용했고

native_splash 라이브러리와 충돌이 일어날 수 있으니 주의하기 바란다.

 

flutter pub add flutter_launcher_icons

을 통해 설치를 해준뒤

 

최상위 경로에 flutter_launcher_icons.yaml 파일 하나 만들어주자

그리고 이안에

flutter_icons:
  ios: true
  image_path: "assets/logo/1024icon2.png"
  android: "launcher_icon"

이렇게 넣어주면 된다.

 

그 다음

flutter pub run flutter_launcher_icons:main

해주면

맨 아랫줄에 성공했다는 문구가 나온다.

 

이제 앱을 다시 빌드해보자

 

IOS에서는 앱 아이콘이 정상적으로 나오는데

안드로이드에서는 조금 이상하게 나올것이다.

 

안드로이드에서 앱들을 보면 원형의 아이콘을 갖고있는데

조금 찾아보니 os에서 사용될 아이콘 경우의 수에 맞게 이미지를 준비해야되는거같다.

여러가지 해결법이 있지만

 

나는 IOS, 안드로이드 아이콘 파일을 따로 지정해줬다.

flutter_icons:
  ios: true
  image_path_ios: "assets/logo/1024icon2.png"
  android: "launcher_icon"
  image_path_android: "assets/logo/1024icon.png"

이렇게 해도 안되면

 adaptive_icon_background: "assets/logo/back.png"
 adaptive_icon_foreground: "assets/logo/1024icon.png"

이렇게 두개 추가해보자

뒤엔 배경색으로만 채워진 이미지를 넣고

앞엔 아이콘만 있는 이미지를 넣으면 된다.

좌측 - IOS / 우측 - Android


플러터는 크로스플랫폼을 지원한다.

따라서 플러터로 개발하다 보면

각 플랫폼에 맞게 처리를 해줘야하는 상황이 있다.

물론 한가지로 통일해 짜도 좋지만

디테일을 살리기 위해선 각자 처리해주는것이 좋다.

 

그렇다면 플러터에선 어떤식으로 플랫폼을 구분할 수 있을까?

방법은 간단하다.

 

dart:io 를 이용하면된다.

import 시켜준뒤

import 'dart:io' show Platform;

Platform.isAndroid
Platform.isFuchsia
Platform.isIOS
Platform.isLinux
Platform.isMacOS
Platform.isWindows

해당 데이터들은 bool 값을 가지고 있다.

따라서 동작 코드에 조건문을 걸어 사용하면된다.

if (GetPlatform.isIOS) {
  showCupertinoDialog(
    context: context,
    builder: (context) => CupertinoAlertDialog(
      title: const Text("Dialog Title"),
      content: const Text("This is my content"),
      actions: [
        CupertinoDialogAction(
          isDefaultAction: true,
          child: const Text("Yes"),
          onPressed: () => Get.back(),
        ),
        CupertinoDialogAction(
          child: const Text("No"),
          onPressed: () => Get.back(),
        )
      ],
    ),
  );
} else {
  showDialog(
      context: context,
      builder: (context) => AlertDialog(
            title: const Text("Dialog Title"),
            content:
                const Text("This is my content"),
            actions: [
              TextButton(
                child: const Text("Yes"),
                onPressed: () => Get.back(),
              ),
              TextButton(
                child: const Text("No"),
                onPressed: () => Get.back(),
              )
            ],
          ));
}

현재 만들고 있는 앱은 IOS와 Android 두가지만 타겟으로 하기떄문에 위와같이 간단하게만 짜줬다.

또 상태관리를 위해 Getx를 사용중인데 마침 또 이런것도 지원해 이용했다.

+ Recent posts