プロジェクトでFlutter 3.24.2バージョンとgo_router 14.2.3バージョンを使っていて発生したエラーを解決するためにfvmを使うことになった内容をまとめました。
普段メールでFlutterのアップデート情報を受け取っているので、特に問題がなければ常に最新バージョンにアップデートしていました。これまでそうしていて大きなエラーに遭遇しなかったので安心していました。
しかし今回はプロジェクトを開発モードで実行し、途中の変更をホットリロードで適用すると、BuildOwner.scheduleBuildFor()関連のエラーが出始めました。
Flutter issueで関連するバグを見つけ、エラーがgo_routerに起因していることが分かりました。go_routerをプロジェクトで使わずにデフォルトのrouter方式を使うとエラーが出ませんでした。しかし開発中にページ遷移のたびにgo_routerを使えないのは不便に感じました。
かといってFlutterバージョンを下げるにはすぐ解決されそうな問題に思えたし、そのままにするとgo_routerを使えませんでした。
そこで解決策として、プロジェクトでgo_routerが使えるバージョンに戻せばいいと考え、fvmを適用してみることにしました。
fvmはFlutter Version Managementで、pyenvやnvmのようなライブラリと使用目的がほぼ同じです。
このようなバージョン管理を使う理由は、プロジェクトを誰が作業しても同じ環境で作業できるようにサポートしてくれるからです。
MacOSでfvmをインストールしようとしました。Installationの指示に従えば大丈夫です。
ただ、curlでインストールしようとしたところエラーが発生しました。

issueを調べてみるとまだ解決されていない問題だったので、Homebrewでインストールを進めました。
このアプローチが正しいか分かりませんが、3.24.2を使っていたので動作するバージョンを探しました。
Flutter Tagsを見ると、これまでリリースされたバージョンを確認できます。3.24.1も駄目だったので3.24.2に上げてみたのですが、minorバージョンは避けようと思い3.22.3バージョンに下げることにしました。
VS CodeでFlutterプロジェクトを開き、ターミナルにfvm use 3.22.3を入力しました。
しかしiosフォルダにいることに後から気づきました。皆さんもコマンド操作する時、必ずパスがプロジェクトのルートから始まっているか確認してくださいね。
コマンドを入力するだけですぐ終わると思っていましたが、構成済みの環境があったのでエラーが出ました。

Dart SDKも最新のFlutterバージョンに合わせていたので、これを変更する必要がありました。pubspec.yamlファイルを開いてenvironmentを修正しました。
environment:
sdk: '>=3.4.4 <4.0.0'それでも複数のエラーが発生しました。ほとんどが既存で使っていたパッケージが最新バージョンのためダウングレードが必要というエラーでした。少し面倒な方法でしたが、pub.devで問題になっているパッケージを一つずつ確認し、以前のバージョンに戻しながらfvm use 3.22.3を繰り返し試しました。問題がなければそのパッケージのエラーメッセージは表示されなくなります。3〜4個のパッケージを解決しながらこの作業を繰り返しました。一度に解決するコマンドがないかfvmサイトで探しましたが、特にないようでした。
現在のFlutterバージョンに最適なバージョンを適用できる方法をご存知の方がいらっしゃったら、共有をお願いします。

こうしていくとインストールが完了し、以下のようなメッセージが表示されるはずです。
VS Codeを再起動すればうまくいくはずです。

プロジェクト内部を見ると.fvmというフォルダが作成されているはずです。これで正常に実行できるはずです!

少し手間がかかるかもしれませんが、この作業は慣れれば20分もかからないでしょう。
Your vision will become clear only when you look into your heart. Who looks outside, dreams. Who looks inside, awakens.
— Carl Jung