InkWell 在 Flutter 中的 GridTile 中的图像顶部产生波纹

Posted

技术标签:

【中文标题】InkWell 在 Flutter 中的 GridTile 中的图像顶部产生波纹【英文标题】:InkWell ripple over top of image in GridTile in Flutter 【发布时间】:2018-06-12 11:24:05 【问题描述】:

当用户点击磁贴时,我正在尝试使用InkWellGridTile 内的图像顶部获得涟漪效果。

我相信图像本身会掩盖波纹,因为当我移除图像时,我会看到波纹。

以下是单个 GridTile 的代码。

return new InkWell(
  onTap: () => debugPrint(s.displayName),
  highlightColor: Colors.pinkAccent,
  splashColor: Colors.greenAccent,
  child: new GridTile(
    footer: new GridTileBar(
      title: new Text(s.displayName),
      subtitle: new Text(s.gameName),
      backgroundColor: Colors.black45,
      trailing: new Icon(
        Icons.launch,
        color: Colors.white,
      ),
    ),
    child: new Image.network( //this is obscuring the InkWell ripple
      s.imageSrc,
      fit: BoxFit.cover,
    ),
   ),
 );

我尝试将 InkWell 移动到层次结构的不同级别,在 Container 中使用 DecorationImage,但这些似乎都无法揭示涟漪。

如何让波纹出现在图块/图像的顶部?

【问题讨论】:

尽管有层次结构,但 Image 确实比 InkWell 具有更高的高度,这很奇怪 【参考方案1】:

通过使用 Stack 并将 InkWell 包装在 Material 小部件中,我能够在图像上出现波纹。

return new Stack(children: <Widget>[
        new Positioned.fill(
          bottom: 0.0,
          child: new GridTile(
              footer: new GridTileBar(
                title: new Text(s.displayName),
                subtitle: new Text(s.gameName),
                backgroundColor: Colors.black45,
                trailing: new Icon(
                  Icons.launch,
                  color: Colors.white,
                ),
              ),
              child: new Image.network(s.imageSrc, fit: BoxFit.cover)),
        ),
        new Positioned.fill(
            child: new Material(
                color: Colors.transparent,
                child: new InkWell(
                  splashColor: Colors.lightGreenAccent,
                  onTap: () => _launchStream(s.displayName),
                ))),
      ]);

【讨论】:

我有透明墨水池,在材质中使用它也会使其对背景图像不透明【参考方案2】:

我认为这是在图像上显示涟漪效应的更好方法。

Ink.image(
    image: AssetImage('sample.jpg'),
    fit: BoxFit.cover,
    child: InkWell(
        onTap: () ,
    ),
),

根本原因是 Flutter 按降序渲染视图。当我们将我们的图像作为 InkWell 的子图像时,效果会被该图像覆盖。

在此处查找更多参考资料:

The Ink widget

Create a Rounded Image Icon with Ripple Effect in Flutter

【讨论】:

感谢您链接我的文章,很高兴它有帮助! 此解决方案不允许为图像创建圆角 我考虑过这种方法,但我相信没有办法让它与更复杂的小部件(例如包含文本和图像的容器)一起工作?【参考方案3】:

使用Stack,我们可以将MaterialInkWell 放在图像上。为了拉伸材质,我们将使用Positioned.fill 小部件。

Stack(
  children: <Widget>[
    Image( ... ),
    Positioned.fill(
      child: Material(
        color: Colors.transparent,
        child: InkWell(
          onTap: ()  ... ,
        ),
      ),
    ),
  ],
);

DartPad | Gist

截图

此屏幕截图取自给定的 dartpad 链接。

【讨论】:

在这里尝试了所有建议。这个最适合我,因为我的主层有AspectRatioFadeInImage @TheMisir 这是唯一一个使用缓存网络图像的灵魂 喜欢它! 相当不错,也可以与卡内的 FadeInImage 配合使用【参考方案4】:

我们创建了这个简单的小部件来在任何给定的孩子上绘制墨水反应。

class InkWrapper extends StatelessWidget 
  final Color splashColor;
  final Widget child;
  final VoidCallback onTap;

  InkWrapper(
    this.splashColor,
    @required this.child,
    @required this.onTap,
  );

  @override
  Widget build(BuildContext context) 
    return Stack(
      children: <Widget>[
        child,
        Positioned.fill(
          child: Material(
            color: Colors.transparent,
            child: InkWell(
              splashColor: splashColor,
              onTap: onTap,
            ),
          ),
        ),
      ],
    );
  

【讨论】:

子小部件的格式丢失。使用Positioned.fill(child: child) 修复【参考方案5】:

截图:

SizedBox(
  height: 200,
  child: Ink(
    decoration: BoxDecoration(
      image: DecorationImage(
        image: ExactAssetImage("chocolate_image"),
        fit: BoxFit.cover,
      ),
    ),
    child: InkWell(
      onTap: () ,
      splashColor: Colors.brown.withOpacity(0.5),
    ),
  ),
)

【讨论】:

优秀的方法。甚至可以使用AspectRatio。如果我可以使用FadeInImage,那会更好。【参考方案6】:

InkWell 包裹在Material 小部件中

Material(   
  child : InkWell(          
      child : YourWidget     
  )      
)  

【讨论】:

以上是关于InkWell 在 Flutter 中的 GridTile 中的图像顶部产生波纹的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:InkWell 在 Card 中完全不起作用

如何在 Flutter 中删除父 ListView 之外的 InkWell 悬停颜色溢出?

如何用 Flutter 处理嵌套的 InkWell?

Dart/Flutter 不使用 Inkwell 和手势检测器更改页面

Flutter InkWell 小部件未通过容器的渐变和颜色显示

Flutter 开发笔记