어플개발/Flutter

[Flutter] flutter 3.7 업그레이드 후 환경 설정

Choi Jaekuk 2023. 3. 17. 17:55

지난 번에 flutter 3.3으로 업그레이드 이후 새로운 버젼 알림이 나타나 3.7 버전으로 업그레이드 하였다.

 

하지만 업그레이드 이후 에러가 나타나 내가 경험한 에러와 해결방법을 적는다.

 

 

1. 업그레이드 직후 환경

# gradle.properties 파일
org.gradle.jvmargs=-Xmx1536M
org.gradle.java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_321.jdk/Contents/Home
android.useAndroidX=true
android.enableJetifier=true

# gradle-wrapper.properties 파일
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip

# android/build.gradle
buildscript {
    ext.kotlin_version = '1.6.10'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

 

2. 빌드 및 오류

1차 빌드 시 : "/Users/cjk/.pub-cache/hosted/pub.dev/permission_handler_android-9.0.2+1/android/src/main/java/com/baseflow/permissionhandler/ServiceManager.java:75: warning: [deprecation] queryIntentActivities(android.content.Intent,int) in android.content.pm.PackageManager has been deprecated" 

에러가 나타나 pubspec.yaml 에서

permission_handler: ^9.2.0   =>   permission_handler: ^10.2.0

로 버전을 올려주었다.

 

2차 빌드 시 "An exception has occurred in the compiler (1.8.0_321)." 에러가 나타나 JAVA 11 설치 후 아래와 같이 환경들을 변경해 주었다.

 

# gradle.properties 파일
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true

# gradle-wrapper.properties 파일
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip

# android/build.gradle
buildscript {
    ext.kotlin_version = '1.7.10'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

 

 

3차 빌드 결과는 성공하였지만

Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

경고가 발생해  아래와 같이 -Xlint:deprecation을 추가해 디버깅을 해보았다.

# android/build.gradle
allprojects {
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
    }
    repositories {
        google()
        jcenter()
    }
}

 

디버깅 결과 webview_flutter_android 에서 deprecation 경고가 여러개 발생하길래 이 기회에 버전을 올려주었다.

 

webview_flutter: ^3.0.4 	=>   webview_flutter: ^4.0.6

 

pub upgrade 이후 코드에서 webview 관련 부분이 모두 에러가 발생해 https://pub.dev/packages/webview_flutter 문서를 확인해보니 3.0 에서 4.0 버전으로 넘어가면서 API들이 모두 바껴 에러가 발생한 것이였다.

 

API Changes 중 일부

 

따라서 문서를 참고해 코드들을 4.0 버전에 맞게 Migration 하였다.

예를들어 아래와 같이 WebView를 선언해서 사용했었는데

 

Container(
    margin: const EdgeInsets.only(left: 20,right: 20),
    height: AppDimens.circleHeight,
    child: WebView(
      initialUrl: url,
      javascriptMode: JavascriptMode.unrestricted,
      onWebViewCreated: (WebViewController webViewController) {
        _controller.complete(webViewController);
        _webViewController = webViewController;
      },
    ),
),

 

4.0 버전부터 webView가 WebViewWidget(NavigationDelegate)로 변경 되어 아래와 같이 코드를 수정하였다.

 

  @override
  void initState() {
    super.initState();
    _webViewController = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(const Color(0x00000000))
      ..loadRequest(Uri.parse(url));
  }
  
  - - - - - - - - - - - - - - - - - - - - - - - - 
  
  Container(
    margin: const EdgeInsets.only(left: 20,right: 20),
    height: AppDimens.circleHeight,
    child:  WebViewWidget(
      controller: _webViewController,
    ),
  ),

 

이후 최종 빌드 시 경고없이 debug / release 모두 둘다 빌드 성공하였다.