Flutter中如何避免Backdrop的模糊效果和TabBar的飞溅效果冲突?

Posted

技术标签:

【中文标题】Flutter中如何避免Backdrop的模糊效果和TabBar的飞溅效果冲突?【英文标题】:How to avoid the conflict between the blur effect of Backdrop and the splash effect of TabBar in Flutter? 【发布时间】:2021-06-27 07:18:56 【问题描述】:
class Sample extends StatelessWidget 
  List<Tab> get tabs => ["Intro", "Flow", "Market"]
      .map((e) => Tab(
            text: e,
          ))
      .toList(growable: false);

  @override
  Widget build(BuildContext context) 
    return Layout(
      title: "Title",
      body: CustomScrollView(
        slivers: [
          _buildHeader(),
          _buildStickyBar(),
        ],
      ),
    );
  

  Widget _buildHeader() 
    return SliverToBoxAdapter(
      child: Stack(
        children: [
          Positioned(child: Image.assets("some.jpg"), top: 40, bottom: -20, right: -20),
          BackdropFilter(
            filter: ImageFilter.blur(sigmaX: 40.0, sigmaY: 40.0),
            child: Container(
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(8),
                color: Colors.white.withOpacity(0.06),
              ),
              child: Text("effect")),
          ),
        ],
      ),
    );
  

  Widget _buildStickyBar() 
    return SliverPersistentHeader(
      pinned: true,
      floating: true,
      delegate: SliverPersistentHeaderEx(//some simple impl
        minHeight: 32,
        maxHeight: 32,
        child: TabBar(
          controller: tabController, //it's not the point
          tabs: tabs),
      ),
    );
  

使用的主题是黑色主题,飞溅是白色的。

所以,blur 效果和 splash 效果会发生冲突。详细来说,TabBar 的飞溅效果会传播到上层小部件(本例中为堆栈)。如果去掉withOpacity,模糊效果会丢失,但扩散问题会解决。

我想保留这些效果。如何限制 TabBar 的 splash 效果只出现在 TabBar 中?

effect

【问题讨论】:

【参考方案1】:

如文档所述:

过滤器将应用于其父级内的所有区域或 祖先小部件的剪辑。如果没有剪辑,将应用过滤器 到全屏。

尝试用 ClipRect 包装你的 BackdropFilter

ClipRect(
        child: BackdropFilter(
          filter: ImageFilter.blur(sigmaX: 40.0, sigmaY: 40.0),
          child: Container(
              decoration: BoxDecoration(
                borderRadius: BorderRadius.circular(8),
                color: Colors.white.withOpacity(0.06),
              ),
              child: Text("effect")),
        ),
      ),

【讨论】:

这样做并没有改变任何东西。相同的行为

以上是关于Flutter中如何避免Backdrop的模糊效果和TabBar的飞溅效果冲突?的主要内容,如果未能解决你的问题,请参考以下文章

backdrop-filter 和filter 写出高斯模糊效果 以及两者区别

backdrop-filter 和 filter

CSS 轻松实现‘毛玻璃’效果

记录--CSS 如何实现羽化效果?

CSS 奇思妙想 | 全兼容的毛玻璃效果

记录:CSS3 模糊效果