FVMで管理しているFlutterアプリをアップグレード
FVMで管理しているFlutterアプリをアップグレード
2022/09/20

現在2.10.5を使用していて、3.13.6にアップグレードを行う。

公式サイトだと、以下のように実行すると書いてある。

$ flutter channel stable
$ flutter upgrade

しかし、実行してみると、

$ fvm flutter channel stable
$ fvm flutter upgrade

You should not upgrade a release version. Please install a channel instead to upgrade it.

エラーが表示されアップグレードできない。

fvmでバージョン管理している場合は、fvmコマンドで新しいバージョンをインストールしていく。

Flutter 3.13.6にアップグレードする

fvmでFlutter 3.13.6をインストール

リリースされているバージョンを確認

$ fvm releases

Sep 13 23  │ 3.13.3           
Sep 13 23  │ 3.13.4           
Sep 15 23  │ 3.15.0-15.1.pre  
Sep 20 23  │ 3.13.5           
--------------------------------------
Sep 21 23  │ 3.15.0-15.2.pre   beta
--------------------------------------
--------------------------------------
Sep 27 23  │ 3.13.6            stable
--------------------------------------

3.13.6がstableバージョンなので、3.13.6にアップグッレードする

$ fvm use 3.13.6

Installing version: 3.13.6...
...
Flutter 3.13.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision ead455963c (12 days ago) • 2023-09-26 18:28:17 -0700
Engine • revision a794cf2681
Tools • Dart 3.1.3 • DevTools 2.25.0
Project now uses Flutter [3.13.6]

ついでにfvmも2.4.1にアップグレード

fvmのバージョンも2.4.1に上げれるみたいなので、アップグレードしておく。

$ pub global activate fvm
Installed executable fvm.
Activated fvm 2.3.1.

しかし、メッセージ通りのコマンドを実行しても上がらない。

正解はfvm内の dart pub 使う。

$ fvm dart pub global activate fvm
Installed executable fvm.
Activated fvm 2.4.1.

dartパッケージをアップグレード

Flutterのバージョンだけでなく、dartパッケージをアップグレードしていく。

まずは、マイナーバージョンをアップグレード

$ fvm flutter pub upgrade

メジャーバージョンのアップグレードを確認

$ fvm flutter pub outdated
Package Name                         Current   Upgradable  Resolvable  Latest   

direct dependencies:                
bonsoir                              *1.0.1+2  *1.0.1+2    2.0.0       2.0.0    
device_info_plus                     *3.2.4    *3.2.4      4.1.2       4.1.2    
file_picker                          *4.6.1    *4.6.1      5.0.1       5.0.1    
flutter_launcher_icons               *0.9.3    *0.9.3      0.10.0      0.10.0   
freezed_annotation                   *1.1.0    *1.1.0      2.1.0       2.1.0    
package_info_plus                    *1.4.2    *1.4.2      1.4.3+1     1.4.3+1  
permission_handler                   *9.2.0    *9.2.0      10.0.0      10.0.0

メジャーバージョンの変更は破壊的変更があるため、ひとつずつ確認していく。

パッケージのpubspec.yamlを見て、flutterのバージョンが3.13に対応しているか確認する。

pubパッケージのバージョンを確認

それからCHANGELOG.mdから破壊的変更を見て、修正箇所を事前に確認しておく。

例えば、
device_info_plusを3.2.4→4.1.2にアップグレードできる。

CHANGELOG.mdを確認すると、4.0.0でAndroidIdという項目が削除されると書いてあり、自分のコードで利用しているのでここはあとで修正が必要だなと確認しておく。

修正が必要な箇所

他に、package_info_plusを10.0.0にアップグレードする際に、CHANGELOG.mdに、compileSdkVersionを33に書き換える必要があると書いてあった。

When updating to version 10.0.0 make sure to update the android/app/build.gradle file and set the compileSdkVersion to 33.

なので、android/app/build.gradle内のcompileSdkVersionを書き換える。

android {
    compileSdkVersion 33

問題なければ、自分のpubspec.yamlを書き換えていく。

-  device_info_plus: ^3.2.4
+  device_info_plus: ^4.1.2

またFlutterのバージョンも最新だけに対応していれば良いので、書き換えておく。

environment:
  flutter: ">=3.13.6"

VSCodeが勝手にpub getしてくれているが、念の為手動でpub getを実行する。

$ fvm flutter pub get

VSCodeを再起動

VSCodeが認識しているFlutterのバージョンが変わらなかった。

VSCodeが認識しているFlutterのバージョンが変わらなかった

setting.jsonでも、

"dart.flutterSdkPath": ".fvm/flutter_sdk",

sdkの位置を指定しており、そのファイルを確認すると、3.13.6に変更されていた。

どうしようもなく一旦VSCodeを再起動してみたら、無事3.13.6に変わった。

VSCodeを再起動してみたら、無事3.13.6に変わった。

コードの修正

dartパッケージをアップグレードするといくらかエラーが出たので修正していく。

エラー箇所を確認

動作確認&修正

Androidでの動作確認

Androidデバイスで起動を試みる

$ fvm flutter run -d ANDROID_DEVICE
e: Incompatible classes were found in dependencies. Remove them from the classpath or use '-Xskip-metadata-version-check' to suppress errors
e: /Users/.../.gradle/caches/transforms-3/3eb6c3f03955a7bda7310b4d29667dba/transformed/jetified-kotlin-stdlib-jdk7-1.7.10.jar!/META-INF/kotlin-stdlib-jdk7.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.5.1.
...
エラー文が大量に出力

見た感じkotlinのバージョンが不適切。

kotlinをリリースされている最新のバージョン1.7.10にする。
https://kotlinlang.org/docs/releases.html#release-details

android/app/build.gradle

buildscript {
    ext.kotlin_version = '1.7.10'

無事起動は完了した。

iOSでの動作確認

iOSデバイスで起動を試みる

$ fvm flutter run -d IOS_DEVICE
[!] CocoaPods could not find compatible versions for pod "Firebase/CoreOnly":
      In snapshot (Podfile.lock):
        Firebase/CoreOnly (= 8.15.0)

      In Podfile:
        firebase_core (from `.symlinks/plugins/firebase_core/ios`) was resolved to 1.22.0, which depends on
          Firebase/CoreOnly (= 9.5.0)

    Specs satisfying the `Firebase/CoreOnly (= 8.15.0), Firebase/CoreOnly (= 9.5.0)` dependency were found, but they required a higher minimum deployment target.

エラーがでた。

firebase_coreパッケージをpubでアップグレードしたせいで、Firebase/CoreOnlyが9.5.0に依存するはずなのに8.15.0になっている。

Podfileを再インストールする。

$ cd ios
$ rm -f Podfile.lock
$ pod repo update
$ pod install

完了したら、再度起動を試みる。

$ fvm flutter run -d IOS_DEVICE

起動できた!