Flutter3にアップグレードしたら、menubarプラグインが使えない

2022/7/18 Flutter エラー・バグ日記 

FlutterがMacのデスクトップアプリに正式対応する前、メニューバーを設置するために、下記ページを参照し、Googleが「flutter-desktop-embedding」として提供している「menubar」のプラグインを使用していた。

 

 

しかし、Flutter3にアップグレードしたところ、エラーになり、このプラグインが使えなくなってしまった。

 

本記事はライトな日記思考で書いているので、詳細説明はしておらず、基本、テキストのみで画像とかは載せておりません。。m(_ _)m

解説記事ではないため、解決していない内容や、その時々の間違った解釈を述べてしまっている可能性が大いにありますので、何卒、ご了承ください。

 

公式の「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の学習で役立ったコンテンツ・書籍 /

 

 

 


Dart入門 – Dartの要点をつかむためのクイックツアー
タイトルとURLをコピーしました