LoginSignup
4
2

More than 3 years have passed since last update.

flutterのInkwellでリップルエフェクトを実現しようとして詰まった

Posted at

Containerに色を付けたら、内部のInkwellの波紋表現が表示されなくなった

flutterの標準的なWidgetである"Container"。これのBoxDecorationを使えば、簡単にContainerの色や形を変えることが出来る。

Container(
   decoration: BoxDecoration(
          color: Colors.blue,
          borderRadius: BorderRadius.circular(10)
        ),
   child: Text("テスト文字列"),
)

Screenshot_1582200738 (2).png

InkWellはマテリアルコンポーネントの一つで、触ると波紋状のエフェクトが出る今風のデザインだ。


InkWell(
   child: Text("テスト文字列"),
   onTap:(){},
)

Screenshot_1582201236 (2).png

単体ではうまく機能したが、いざContainerにInkWellをぶち込んで見ると、なぜかRippleEffectが表示されない

Container(
   decoration: BoxDecoration(
          color: Colors.blue,
          borderRadius: BorderRadius.circular(10)
        ),
   child: InkWell(
          child: Text("テスト文字列"),
          onTap: (){},
   ),
)

どうやらリップルエフェクトを合成するとき、なぜか外側のContainerの色が優先されるらしい。

解決法

その1

BoxDecorationのBackgroundBlendModeを変更してみる


Container(
   decoration: BoxDecoration(
          color: Colors.blue,
          borderRadius: BorderRadius.circular(10),
          backgroundBlendMode: BlendMode.color,
        ),
   child: InkWell(
          child: Text("テスト文字列"),
          onTap: (){},
   ),
)

これはうまく行かない。一応波紋は出るが、さらに外側の背景の色も混ざってコンテナの色がおかしくなる。
Screenshot_1582200767 (2).png

Container()をInk()に変える


Ink(
   decoration: BoxDecoration(
          color: Colors.blue,
          borderRadius: BorderRadius.circular(10),
        ),
   child: InkWell(
          child: Text("テスト文字列"),
          onTap: (){},
   ),
)

これでうまくいった。
Screenshot_1582200936 (2).png

その他

backgroundBlendModeはたくさん設定があるのでそれを使えば普通にうまく行った可能性はある。
でもめんどくさかったので……

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2