ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [개발하는남자의 핸즈온 플러터] 플러터 최신 버전 소스코드 android build.gradle migration 책의 잘못 표기된 내용 정정 및 소통 채널 공지
    개발일지/flutter 2024. 8. 25. 23:10

    내 여러분 안녕하세요 개발하는남자 개남입니다. 핸즈온 플러터 책이 출간된 지 어느덧 한 달이라는 시간이 흘렀습니다.

    (시간이 참 빠른것 같습니다.)

    한 달이라는 시간이 흐르는 동안 독자분들의 문의 이메일도 주시고 계시는데 생각해 보니 소통 채널이 있으면 좋겠다 싶어서 관련 내용도 공유드릴 겸 책에 잘못 기재된 내용에 대한 정정 사항도 안내해 드리고 그리고 무엇보다 중요한 당근마켓 클론코딩을 위한 플러터 버전 최신화 대응 방안에 대해서 가이드를 드려야 할 것 같아 이렇게 포스팅을 쓰게 되었습니다.

    책에 잘못 표기된 내용 (타입추론) 기본 개념

    우선 타입추론에 대해서 간단하게 설명드리고 잘못된 내용에 대해서 공유 드리겠습니다.

    예를 들어 다음과 같이 변수를 선언 시 명시적으로 타입을 정의하는 것과 타입추론을 사용하는 것의 차이입니다.

    String data = "개발하는남자";
    var dataTypeInference = "개발하는남자";

    컴파일러는 둘 다 String 타입으로 인식하여 프로세스를 처리하게 됩니다. 하지만 위의 경우 String타입이 아닌 다른 타입으로 변경해야 하는 요구사항이 생겨서 수정을 하게 된다면 명시적 타입을 사용한 경우는 오류를 범하지만 아래의 타입추론으로 사용한 경우는 오류가 생기지 않습니다.

    String data = {"name": "개발하는남자"}; // type 오류
    var dataTypeInference = {"name": "개발하는남자"};

     

    위의 변수 data의 경우 Type 오류가 발생하는 반면 아래 dataTypeInference의 경우 자동적으로 Map타입으로 인식하고 정상적으로 프로세스를 진행할 수 있음을 확인할 수 있습니다.

    이처럼 타입추론을 활용하면 코드를 유연성 있게 대응할 수 있다는 장점이 있습니다.


    핸즈온 플러터에서 타입추론 잘못 표기된 내용 공유

    핸즈온 플러터 96페이지에 기록된 Map 타입의 타입추론 관련 잘못 표기된 내용이 있습니다.

    위 글에서 var blankUserInfo = {};라고 변수를 선언하면 타입추론으로 자동적으로 Map으로 처리하게 됩니다.

    하지만 글에서는 Map이 아닌 Set타입으로 선언된다고 잘못 기재되어있습니다.

    만일 Set타입을 타입추론으로 하기원 할 때는 다음과 같이 사용해야 합니다.

    var setTypeInference = <String>{};

    관련된 내용은 93페이지에서 이미 다루고 있는 내용입니다.

    다시 한번 혼란을 드려서 죄송합니다. 이 부분은 만약 다음 2판 인쇄를 할 수 있게 된다면 정정해서 올리도록 하겠습니다.


    당근마켓 클론코딩 플러터 3.24.0 버전 대응

    책을 집필할 당시 플러터 버전은 3.13.x 버전대였던 것으로 기억합니다. 플러터의 버전이 3.16.x 버전부터 안드로이드 build.gradle 방식이 변경되었습니다.

    To build a Flutter app for Android, Flutter's Gradle plugins must be applied. Historically, this was done imperatively with Gradle's legacy, imperative apply script method.

    In Flutter 3.16, support was added for applying these plugins with Gradle's declarative plugins {} block (also called the Plugin DSL) and it is now the recommended approach. Since Flutter 3.16, projects generated with flutter create use the Plugin DSL to apply Gradle plugins. Projects created with versions of Flutter prior to 3.16 need to be migrated manually.

     

     

    한마디로 3.16 버전이전에 생성된 플러터 프로젝트와 그 이후의 플러터 프로젝트는 Gradle처리방식이 변경되었다고 보시면 됩니다. 그래서 제가 제공드리는 플러터 프로젝트는 이전 버전이기 때문에 마이그레이션을 수동으로 해줘야 하는 상황이 발생하게 되었습니다. 관련해서 플러터 공식문서에서 자세하게 다루고 있기 때문에 해당 내용을 따라서 수행하시면 큰 문제없이 migration을 할 수 있을 것입니다.

     

    개발하는 남자 Github에 제공된 당근마켓 클론 코딩 소스코드에 flutter-version/3.24.0 브런치로 최신 버전 대응된 소스코드를 공유드렸으니 필요하신 분들은 그 소스코들 참조하시면 됩니다.

     

    Android Build Gradle 마이그레이션 하는 방법

    1️⃣ `/android/settings.gradle` 대응

    <app-src>/android/settings.gradle 파일을 다음과 같이 수정합니다.

    pluginManagement {
        def flutterSdkPath = {
            def properties = new Properties()
            file("local.properties").withInputStream { properties.load(it) }
            def flutterSdkPath = properties.getProperty("flutter.sdk")
            assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
            return flutterSdkPath
        }()
    
        includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
    
        repositories {
            google()
            mavenCentral()
            gradlePluginPortal()
        }
    }
    
    plugins {
        id "dev.flutter.flutter-plugin-loader" version "1.0.0"
        id "com.android.application" version "{agpVersion}" apply false
        id "org.jetbrains.kotlin.android" version "{kotlinVersion}" apply false
    }
    
    include ":app"

    여기서 중요한 점은

    id "com.android.application" version "{agpVersion}" apply false
    id "org.jetbrains.kotlin.android" version "{kotlinVersion}" apply false

    {agpVersion}{kotlinVersion} 이 부분을 그대로 두는 게 아닌 해당하는 버전을 넣어줘야 합니다. {agpVersion}{kotlinVersion} 두 개의 버전을 어디서 참조해서 넣어야 하는지는 <app-src>/android/build.gradle 파일을 열어보면 나와있습니다.

    buildscript {
        **ext.kotlin_version = '1.7.10'
        repositories {
            google()
            mavenCentral()
        }
    
        dependencies {
            classpath 'com.android.tools.build:gradle:**7.3.0'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        }
    }
    
    allprojects {
        repositories {
            google()
            mavenCentral()
        }
    }
    
    rootProject.buildDir = '../build'
    subprojects {
        project.buildDir = "${rootProject.buildDir}/${project.name}"
    }
    subprojects {
        project.evaluationDependsOn(':app')
    }
    
    tasks.register("clean", Delete) {
        delete rootProject.buildDir
    }

    붉은색 코드의 버전이 각각 {agpVersion}{kotlinVersion} 에 해당되는 버전입니다.

    {kotlinVersion}1.7.10 이며 {agpVersion}7.3.0으로 적용하면 되겠습니다.

    그리고 당근마켓 클론코딩 프로젝트에서는 google-services 플러그인도 사용하고 있기 때문에

    다음과 같이 <app-src>/android/settings.gradle 파일을 수정하면 되겠습니다.

    pluginManagement {
        def flutterSdkPath = {
            def properties = new Properties()
            file("local.properties").withInputStream { properties.load(it) }
            def flutterSdkPath = properties.getProperty("flutter.sdk")
            assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
            return flutterSdkPath
        }()
    
        includeBuild("$flutterSdkPath/packages/flutter_tools/gradle")
    
        repositories {
            google()
            mavenCentral()
            gradlePluginPortal()
        }
    }
    
    plugins {
        id "dev.flutter.flutter-plugin-loader" version "1.0.0"
        id "com.android.application" version "7.3.0" apply false
        id "org.jetbrains.kotlin.android" version "1.7.10" apply false
        id "com.google.gms.google-services" version "4.3.14" apply false
    }
    
    include ":app"

    2️⃣ 기존 `/android/build.gradle` 소스코드 수정

    3️⃣ `/android/app/build.gradle` 소스코드 수정

    이것으로 안드로이드 마이그레이션은 끝이 납니다.

     

    그리고 프로젝트의 라이브러리를 최신 버전으로 올려줘야 합니다. 특히 파이어베이스 관련 라이브러리는 최신 버전으로 반드시 올려줘야 문제없이 사용이 가능합니다.

    다음은 flutter pubspec.yaml 파일에 사용된 최신버전 라이브러리 목록입니다.

      cupertino_icons: ^1.0.2
      get: ^4.6.5
      flutter_svg: ^2.0.7
      equatable: ^2.0.5
      google_fonts: ^4.0.4
      firebase_core: ^3.3.0
      firebase_auth: ^5.1.4
      cloud_firestore: ^5.2.1
      firebase_storage: ^12.1.3
      shared_preferences: ^2.1.2
      google_sign_in: ^6.2.1
      sign_in_with_apple: ^6.1.1
      crypto: ^3.0.3
      photo_manager: ^3.2.3
      flutter_map: ^5.0.0
      geolocator: ^9.0.2
      latlong2: ^0.9.0
      uuid: ^3.0.7
      carousel_slider: ^5.0.0
      cached_network_image: ^3.2.3
      timeago: ^3.5.0
      flutter_keyboard_visibility: ^5.4.1

    모든 라이브러리를 최신버전화 하지 않았습니다. 문제가 되는 라이브러리들만 버전을 최신화했으며 문제없는 라이브러리는 그대로 유지하였습니다. 이것으로 플러터 최신버전 대응에 대한 내용을 가이드해드렸습니다. 따라 하시다 문제가 생기셨다고 한다면 github에 flutter-version/3.24.0 브런치를 참조해주시면 되겠습니다.

    소통 채널 소개

    마지막으로 유튜브 구독자들이나 책을 읽으면서 공부하시는 독자분들 모두 소통채널이 있으면 좋겠다고 생각이 되었습니다. 지금까지는 별도의 채널이 없었어서 메일로 문의하시는 분들에 한에서 답변을 드리고 있었는데 공부하시는 분들끼리도 서로 소통하면서 문제를 해결할 수 있지 않을까?라는 생각으로 소통채널을 만들었습니다. 물론 라이브 방송을통해 직접적인 소통도 하고 싶긴한데 아직 둘째가 어려서 아이가 통잠을 자기 시작하면 늦은 밤에는 가능하지 않을까? 라는 생각도 들기도 하고요 그것은 차차 계획해 보도록 하고 소통채널 디스코드를 만들었습니다. 참여는 자유고 함께 공부하면서 궁금한 사항들에 대해서 서로 공유하고 같이 문제를 해결해 나가는 취지로다가 만든 것이니 부담 없이 자유롭게 소통하면 좋을 것 같습니다.

    사실 채널이 활성화될지도 의문이고 참여자가 있을지도 의문이긴 한데 제가 성실하게 답변을 드릴 수 있을지도 솔직히 의문입니다. 제가 유튜브 채널만 운영한다면 가능하겠지만 제가 회사를 다니고 있다 보니 주중 업무시간에는 답변드릴 수 없다는 것과 퇴근 후에는 육아를 하게 되기 때문에 늦은 시간에만 답변을 드릴 수 있어서 과연 어느 정도 운영이 될지 모르겠지만 그래도 고민만 하기보다는 시도해 보는 게 좋겠다는 생각이 들어서 만들게 되었습니다.

     

    디스코드 주소 : https://discord.gg/Xd7W7WTM

     

    개발하는남자 Discord 서버에 가입하세요!

    Discord에서 개발하는남자 커뮤니티를 확인하세요. 3명과 어울리며 무료 음성 및 텍스트 채팅을 즐기세요.

    discord.com

     

     

     

    댓글

Designed by Tistory.