Flutter3にアップグレードしたら、menubarプラグインが使えない
結論:Flutter3用のアップデート版をGitHubから直接インポートする
2022/7/18 Flutter エラー・バグ日記
FlutterがMacのデスクトップアプリに正式対応する前、メニューバーを設置するために、下記ページを参照し、Googleが「flutter-desktop-embedding」として提供している「menubar」のプラグインを使用していた。
しかし、Flutter3にアップグレードしたところ、エラーになり、このプラグインが使えなくなってしまった。
公式の「PlatformMenuBar」に変更するも、複数画面に設置したらエラー
Flutter3では、「PlatformMenuBar」というデスクトップアプリ用にメニューバーを作成できる新しいクラスが提供されているので、下記の公式ページを参考に、早速置き換えてみた。
確かに設置することはできたが、アプリの画面ごとにメニューバーを設置すると、画面切り替え時に以下のエラーが発生してしまった。
'package:flutter/src/widgets/platform_menu_bar.dart': Failed assertion: line 376 pos 12: '() { // It's OK to lock if the lock isn't set, but not OK if a different // context is locking it. if (_lockedContext != null && _lockedContext != context) { return false; } _lockedContext = context; return true; }()': is not true.
こちらの説明を見ると、「PlatformMenuBar」は一度に1つしかアクティブにできない、ということらしく、複数の画面でそれぞれ「PlatformMenuBar」を設置することはできない?模様。
いったんアクティブになった「PlatformMenuBar」を破棄できれば良さそうだが、ソースコードや公式の説明ページを見てもその方法が分からず。。(「debugUnlockDelegate」メソッドを使って何かやるかもしれないのだが、、)。
ネットで調べても全く情報が出てこない。。
最初に「main.dart」で全画面分の「PlatformMenuBar」を一気に設置する方法も試みたが、ページによって、メニュー項目のアクティブ・非アクティブを切り替えたいので、処理が複雑になり、やりづらい。。
従前の「menubar」のプラグインなら、ページごとに「initState」メソッドの中で、メニューバーを設置する「Submenu」クラスのインスタンスと「setApplicationMenu」メソッドを書けば良かったので、正直使いやすかった。。
menubarプラグインがFlutter3対応用にアップデートされた!
しばらく日を置いて、もう一度「flutter-desktop-embedding」のページを見てみると、「[menubar] Update to work with Flutter 3」と書かれ、アップデートされていた。
こちらに、Flutter3用に書き直すべき箇所が分かるように掲示されている。
早速、上記に沿ってメソッド名やクラス名を修正すると、問題なく動くようになった。
※修正したのは以下の点。
- 「Submenu」→「NativeSubmenu」に修正
- 「MenuItem」→「NativeMenuItem」に修正
- 「onClicked」→「onSelected」に修正
あくまで非公式のプラグインであり、今後大きく変更される可能性があるとは書かれているが、とりあえずエラーにならず動くので、こちらをしばらく採用することとする。
ちなみに、2022年7月時点では、「pubspec.yaml」に記載する際、下記のように7桁のハッシュ値を指定することで、今回の最新版のプラグインをインポートできる。
menubar: git: url: https://github.com/google/flutter-desktop-embedding.git path: plugins/menubar ref: 12decbe
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/