Flutter-ポップアップメニュー2

前回Flutter-ポップアップメニューでスタイル設定などでポップアップメニューのMaterial対応やカスケード対応などやってみたのだけど、メニュー内の文字スタイルなどMenu側ではなくListTile側に寄ってしまうのではないかと思い、自前でウィジェットを作成したほうが良いのではないかと考え、実装してしまった。

ウィジェット類のソースはGist側。

popupmenuの中身をtile形式で表示するためのウィジェット類
popupmenuの中身をtile形式で表示するためのウィジェット類. GitHub Gist: instantly share code, notes, and snippets.

ListTile風なTile配置ウィジェットをPopupMenuTileとして実装。

これに合わせてPopupMenuItem、PopupMenuButton、CheckedPopupMenuItemのpaddingを0にしたラッピングクラスを用意。
PopupMenuButtonに関してはメニューが出るオフセット値も想定したものをデフォルトにしている。

今のPopupMenuItem、PopupMenuButton、CheckedPopupMenuItemの末尾にPを付けて、ListTileをPopupMenuTileに置き換えることでMaterial対応なメニューでかつカスケードなメニューが構築できるようにしてみた。

実際に実装し動かしてみたのが以下の感じ。

subtitleを入れても高さはMenuの要件にあった高さに調整ができたのもよかった点かな。

独自になったのがPopupMenuTileのsubtitleの文字スタイル。
仕様としては定義されていないので、MenuのtitleのスタイルとListのsubtitleから類推し、Label Medium/On surface variantを使うようにした。

次に注意点としては、CheckedPopupMenuItemPがCheckedPopupMenuItemをコピペして作った点。

CheckedPopupMenuItemをextendしてState側のbuildChildをオーバーライドするのが一番いい実装だったのだけど、State側クラスがプライベートでまたプライベートなアニメーションコントロールを使用していたため、この方法を断念。

コピペしてListTile部分をPopupMenuTileとするようにした。

コメント

タイトルとURLをコピーしました