Flutter:如何在特定子组件上停止图像滤镜(颜色滤镜/绘制滤镜)?

3
我想对一个ListView应用一个ImageFilter,以便所有子项都受到影响,并且所有子项相互影响,例如混合颜色。(因此,将过滤器应用于子项而不是listview本身是行不通的)。
这很好。但现在我需要在之前绘制的小部件上放置另一个小部件(考虑颜色渐变的容器)- 而不受祖先imageFiltered图像滤镜的影响。
我想要一个“Blocker”小部件,以便先前的过滤器仅适用于树中的此部分 - 不再向下传递。这可能吗? (顺便说一句,围绕ListViews子项的BackdropFilter也无效,尽管可以通过ClipRect在上游停止它,但它不会让子项“交互”/让过滤器混合子项。)
阅读了很多关于canvas和CustomPaints的文章后,我认为我需要使用RenderObject来解决问题,就像here建议的那样,但我还是无法做到... 而且我似乎仍然难以理解canvas和paint的概念:父小部件的过滤器甚至能被“阻止”吗?
作为一种解决方法,我想象了一个第二个、同步且不可交互的ListView,具有所需效果,作为一个包含所有不应被操作的内容的主要ListView的背景...。
在写作时,我想到了一个想法:也许可以自定义一个listviews builder来接受第二个未受影响的子项?
非常感谢您的帮助。
简而言之:

MultipleCustomFilters( // <- ImageFiltered(filter: filter1, child: ImageFiltered(filter2, child: child
  child: ListView.builder(
    itemCount: 5,
    itemBuilder: (BuildContext context, int index) {
      return Center(
        child: Stack(
          children: [
            Container(
              width: 100,
              height: 100,
              color: Colors.blue,
              child: Text("I want to receive all filters!"),
            ),
            FilterBlocker( // <- How to build this?
              child: Container(
                width: 40,
                height: 40,
                color: Colors.indigo,
                child: Text("I don't want to receive any previous paint manipulations! How?"),
              ),
            ),
          ],
        ...

1个回答

0

像这样包裹在BackdropFilter中:

import 'dart:ui';

BackdropFilter(
  filter: ImageFilter.dilate(),
  child: blockFilterChild,
);

请注意,这里的“无内核膨胀”(在此处或在Flutter中没有参数)意味着对图像没有影响。但是,这将覆盖任何其他过滤器,从而产生您想要的BlockFilter小部件。 - Abhi Shake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接