お問い合わせ
  • Tech
  • アニメーション
  • アプリ開発

Flutterで「浮いたUI」を実装する設計方法

Flutterで、下記画像のようなタップ可能なカードを浮かせるようなUIを実装しようとすると、

 

一見簡単そうに見えて、実は多くの落とし穴が存在します。
特に問題になるのが、以下のようなケースです。
  • カード全体がタップできなくなる
  • 端末サイズごとにレイアウトが崩れる
  • position の数値調整が泥沼化する
本記事では、これらの問題を根本から解決するための設計思想と、
実装アプローチについて解説いたします。

UIは「見た目」ではなく「構造」で分解する

まず重要なのは、UIをいきなり実装しないことです。
Flutterにおいては、UIをパーツ単位で分解して考えることが不可欠です。

今回のUIは、直感的には次の3つのパーツに見えます。

  • 上半分の背景画像コンテンツ
  • 下半分の白背景コンテンツ
  • 浮いているカードWidget
しかし、この3分割のまま実装すると、問題が発生します。

よくある実装例

  1. Columnで上下を分ける
  2. Stackでカードを浮かせる
  3. bottom: -80 などでめり込ませる

 

図解:NGパターン(3分割設計)

 

問題点

タップ領域が欠落する
Positioned(bottom: -80)で無理やり移動させたWidgetは、見た目とhitTest領域が一致しなくなる場合があります。結果として、カード全体がタップできなくなります。
端末サイズによるレイアウト破綻

例えば、次のような実装を行った場合
Positioned(bottom: 600)

この数値は端末サイズに依存するため、
  • 小さい端末:カードが見切れる
  • 大きい端末:カードの位置が不自然になる
といった問題が発生します。
position hack の発生
positionの数値調整が繰り返され、「なぜこの数値なのか分からないコード」が増殖します。
これは、設計ではなく調整でUIを作っている状態です。

UIの分解方法を見直す

ポイントは、「擬似領域」という概念を導入することです。

ここでいう「擬似領域」とは、
本来は存在しないが、レイアウト上あえて用意する仮想的な背景領域のことです。

カードを直接移動させて重ねるのではなく、
カードが自然に存在できる空間を先に作るということです。

新しい構造

  • 上半分の背景画像コンテンツ
  • カード下部までの白背景の擬似領域(タップ領域)
  • カードWidget
  • 下半分の白背景コンテンツ

 

図解:OKパターン(4分割設計)

ここで重要なのは、
カードを無理に移動させるのではなく、
カードが存在できる「空間」を先に作るという考え方です。

hitTest領域の意識

Flutterでは、Widgetがタップ可能かどうかは、
見た目ではなく「レイアウト上の領域」によって決まります。

NGパターン

見た目:カードが存在する
実際のhitTest領域:存在しない

OKパターン

見た目:カードが存在する
実際のhitTest領域:擬似領域によって確保されている

擬似領域を作成することで、
カード全体が正しくhitTest領域内に収まり、
意図した通りタップ可能になります。

position hack はアンチパターンである

positionの数値によって無理やり配置を調整する手法は、
短期的には有効に見えますが、長期的には保守性を著しく低下させます。
特に、以下の問題を引き起こします。
  • 端末サイズ依存のバグ
  • 意図不明なマジックナンバーの増加
  • hitTest領域の不整合

 

そのため、position hack はアンチパターンと考えるべきです。

まとめ

本記事では、Flutterで背景画像の上にカードを浮かせるようなUIを、どのように設計・実装するかについて紹介しました。

一見すると、StackとPositionedを使って位置を調整すれば簡単に実装できそうですが、実際にはタップ領域が正しく機能しなかったり、端末サイズによってレイアウトが崩れてしまったりと、思わぬ問題が発生しやすいポイントでもあります。

そこで今回は、UIを「上半分の背景画像」「下半分の白背景」「カード」「擬似領域」の4つに分解し、カードを無理に動かすのではなく、カードが自然に配置される空間を先に作るというアプローチを採用しました。

FlutterのUI実装は、見た目を再現するだけでなく、Widgetツリーやレイアウトの構造を意識して設計することが重要です。
positionの数値調整に頼るのではなく、構造的に考えることで、可読性や保守性の高いコードにつながります。

今回紹介した考え方が、複雑なUIを実装する際の一つのヒントになれば幸いです。

ドコドア エンジニア部

ドコドア エンジニア部

Flutterなどの技術を活用し、ユーザーにとって価値ある高品質なモバイルアプリ・Webアプリの開発に取り組んでいます。
このブログでは、アプリ開発の現場で培ったフロントエンド、バックエンド、インフラ構築の知識から生成AI活用のノウハウまで、実践的な情報をアプリ開発に悩む皆様へ向けて発信しています!
【主な技術スタック】 Flutter / Firebase / Svelte / AWS / GCP / OpenAI API

Contact Us

Web制作、Webマーケティング、SFA・MA導入支援に関するお悩みがある方は、お気軽にご相談ください。

お問い合わせ・ご相談

ホームページ制作、マーケティングにおける
ご相談はお気軽にご連絡ください。

資料請求

会社案内や制作実績についての資料を
ご希望の方はこちらから。

お電話でのお問い合わせ

お電話でのご相談も受け付けております。

※コールセンターに繋がりますが、営業時間内は即日
担当より折り返しご連絡をさせて頂きます。

9:00-18:00 土日祝休み

電話する 無料相談はこちら