You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义RenderObject实现ImageFilter模糊与裁剪的异常问题

自定义RenderObject实现模糊裁剪时Stack多子组件失效问题

因特定需求需自定义RenderObject,无法使用现成的BackdropFilter和ClipPath组件,尝试在Stack的子组件上实现ImageFilter模糊效果。但当Stack包含其他子组件时裁剪功能失效,注释掉该子组件后功能恢复正常。

相关代码

import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter image filter blur demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const Demo(),
    );
  }
}

class Demo extends StatefulWidget {
  const Demo({super.key});

  @override
  State<Demo> createState() => _DemoState();
}

class _DemoState extends State<Demo> {
  Offset offset = Offset.zero;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: [
          // 注释掉这行后裁剪功能恢复正常
          const Text("hello welcome to the demo of the backdrop blur"),
          Positioned(
            top: offset.dy,
            left: offset.dx,
            child: GestureDetector(
              onPanUpdate: (d) {
                setState(() {
                  offset += d.delta;
                });
              },
              child: SizedBox(
                width: 100,
                height: 100,
                child: Blur(
                    child: Container(
                  width: 100,
                  height: 100,
                  color: Colors.red.withOpacity(0.3),
                )),
              ),
            ),
          ),
        ],
      ),
    );
  }
}

class Blur extends SingleChildRenderObjectWidget {
  const Blur({
    Key? key,
    Widget? child,
  }) : super(key: key, child: child);

  @override
  RenderObject createRenderObject(BuildContext context) {
    return RenderBlur();
  }

  @override
  void updateRenderObject(
      BuildContext context, RenderBlur renderObject) {}
}

class RenderBlur extends RenderProxyBox {
  @override
  void paint(PaintingContext context, Offset offset) {
      // 绘制子组件
    context.paintChild(child!, offset);

    final blurLayer = BackdropFilterLayer(
      filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
      blendMode: BlendMode.srcOver,
    );
    final clipLayer = ClipPathLayer(
      clipPath: Path()..addRect(offset & size),
    );

    context.addLayer(blurLayer);
    context.addLayer(clipLayer);

    super.paint(context, offset);
  }
}

现象截图

  • 当前效果(Stack包含Text子组件时):
    当前效果截图

  • 正常效果(注释掉Stack首个Text子组件后):
    正常效果演示

内容的提问来源于stack exchange,提问作者Ansh Rathod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:28:28