【Flutter】CardウィジェットにRippleエフェクトを実装する

# 結論

FlutterでRippleエフェクトをつけたいときはInkWellを使うと思いますが、
Cardウィジェットと一緒に使う際は、CardをInkWellでラップするのではなく、CardでInkWellをラップする。

```main.dart
Card(
  child: InkWell(  // InkWellはCardの子ウィジェット
    onTap: () {},
    child: Container(
      height: 300.0,
    ),
  ),
),
```

# 背景

例えば、こんな感じのCardがあります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/833a6893-70f2-8e23-ed40-d6a6f452831b.png" width=40%>

コードはこちら

```home_page.dart
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Card(
          child: Container(
            height: 300.0,
            child: Column(
              children: <Widget>[
                Container(
                  decoration: BoxDecoration(
                    borderRadius: BorderRadius.only(
                      topLeft: Radius.circular(4.0),
                      topRight: Radius.circular(4.0),
                    ),
                    color: Colors.grey,
                  ),
                  height: 150.0,
                ),
                Container(
                  margin: const EdgeInsets.symmetric(
                    vertical: 15.0,
                    horizontal: 15.0,
                  ),
                  alignment: Alignment.centerLeft,
                  child: Text(
                    'Title...',
                    style: TextStyle(
                      fontSize: 20.0,
                    ),
                  ),
                ),
                Container(
                  margin: const EdgeInsets.symmetric(
                    horizontal: 15.0,
                  ),
                  alignment: Alignment.centerLeft,
                  child: Text(
                      'SubTitleSubTitleSubTitleSubTitleSubTitleSubTitle...'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

```

このCardに対して、InkWellでRippleエフェクト付きでクリックイベントを実装してみます。
最初に書いたのはこのコード。
他のウィジェットと同様にCardをInkWellでラップしてみました。

```home_page.dart
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: InkWell(  // CardをInkWellでラップしてみる
          onTap: () {},
          child: Card(
            child: Container(
              height: 300.0,
              child: Column(
                children: <Widget>[
                  Container(
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.only(
                        topLeft: Radius.circular(4.0),
                        topRight: Radius.circular(4.0),
                      ),
                      color: Colors.grey,
                    ),
                    height: 150.0,
                  ),
                  Container(
                    margin: const EdgeInsets.symmetric(
                      vertical: 15.0,
                      horizontal: 15.0,
                    ),
                    alignment: Alignment.centerLeft,
                    child: Text(
                      'Title...',
                      style: TextStyle(
                        fontSize: 20.0,
                      ),
                    ),
                  ),
                  Container(
                    margin: const EdgeInsets.symmetric(
                      horizontal: 15.0,
                    ),
                    alignment: Alignment.centerLeft,
                    child: Text(
                        'SubTitleSubTitleSubTitleSubTitleSubTitleSubTitle...'),
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}
```

するとタップ時のRippleがカードの後ろに行ってしまいました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/88e50bb3-42cf-491f-cfb3-a63512b146b4.gif" width=40%>

# 解決法

InkWellはCardの子ウィジェットとして定義しないといけないらしいです。

おそらくこちらの記事で触れられているようにCardが不透明な背景色を持っているせいなのかな？と思いました。
https://qiita.com/najeira/items/db6edb1c8d8f75042b98

```home_page.dart
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Card(      
          child: InkWell( // Cardの子ウィジェットとしてInkWellを使用する
            onTap: () {},
            child: Container(
              height: 300.0,
              child: Column(
                children: <Widget>[
                  Container(
                    decoration: BoxDecoration(
                      borderRadius: BorderRadius.only(
                        topLeft: Radius.circular(4.0),
                        topRight: Radius.circular(4.0),
                      ),
                      color: Colors.grey,
                    ),
                    height: 150.0,
                  ),
                  Container(
                    margin: const EdgeInsets.symmetric(
                      vertical: 15.0,
                      horizontal: 15.0,
                    ),
                    alignment: Alignment.centerLeft,
                    child: Text(
                      'Title...',
                      style: TextStyle(
                        fontSize: 20.0,
                      ),
                    ),
                  ),
                  Container(
                    margin: const EdgeInsets.symmetric(
                      horizontal: 15.0,
                    ),
                    alignment: Alignment.centerLeft,
                    child: Text(
                        'SubTitleSubTitleSubTitleSubTitleSubTitleSubTitle...'),
                  ),
                ],
              ),
            ),
          ),
        ),
      ), 
    );
  }
}
```

このようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147934/3cb7214f-5a8c-59f7-6c44-2e3f35429933.gif" width=40%>