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

如何在Flutter中绘制类似Facebook评论区的曲线?

Flutter 实现 Facebook 评论区层级引导曲线方案

这个效果是嵌套评论的左侧层级引导线,优先用CustomPainter自定义绘制实现,还原度最高,具体实现步骤如下:

  • 先定义评论数据结构,每个评论对象携带level层级参数、子评论列表,根评论层级为1,子评论层级为父评论层级+1
  • 封装自定义绘制类,根据当前评论的层级绘制对应数量的引导线:
    • 层级大于1时,前level-1层绘制通顶的垂直直实线,线宽1px,颜色选浅灰色即可匹配Facebook样式
    • 第level层绘制L型圆角曲线:先垂直向下延伸到评论内容垂直居中位置,拐角做2px圆角处理后向右水平延伸8px,对齐用户头像左侧位置
  • 递归渲染评论列表,每个评论项用Stack布局,底层放自定义绘制的引导线,上层放评论内容,内容左侧设置对应缩进避免遮挡引导线

核心绘制代码示例:

class CommentGuidePainter extends CustomPainter {
  // 当前评论层级
  final int level;
  // 每层缩进宽度,建议设为24
  final double indentPerLevel;
  // 引导线颜色
  final Color lineColor;
  // 引导线宽度
  final double lineWidth;

  CommentGuidePainter({
    required this.level,
    this.indentPerLevel = 24,
    this.lineColor = const Color(0xFFE4E6EB),
    this.lineWidth = 1,
  });

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = lineColor
      ..strokeWidth = lineWidth
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round;

    // 绘制前n-1层的通顶竖线
    for (int i = 1; i < level; i++) {
      final x = i * indentPerLevel - indentPerLevel / 2;
      canvas.drawLine(Offset(x, 0), Offset(x, size.height), paint);
    }

    // 绘制最后一层的L型圆角引导线
    if (level > 1) {
      final lastLineX = level * indentPerLevel - indentPerLevel / 2;
      final cornerY = size.height / 2;
      // 垂直段
      canvas.drawLine(Offset(lastLineX, 0), Offset(lastLineX, cornerY - 2), paint);
      // 圆角拐角
      canvas.drawRRect(
        RRect.fromRectAndRadius(
          Rect.fromLTWH(lastLineX, cornerY - 2, 2, 2),
          const Radius.circular(2),
        ),
        paint,
      );
      // 水平段
      canvas.drawLine(Offset(lastLineX + 2, cornerY), Offset(lastLineX + 8, cornerY), paint);
    }
  }

  @override
  bool shouldRepaint(covariant CommentGuidePainter oldDelegate) {
    return oldDelegate.level != level || oldDelegate.lineColor != lineColor;
  }
}

使用方式:在评论项的Stack组件中先放置CustomPaint使用上述绘制类,再放置评论内容组件,给内容组件设置EdgeInsets.only(left: level * 24)的左侧内边距即可。如果需要适配评论收起/展开交互,只需要动态更新子评论的层级参数即可自动适配引导线绘制逻辑。

内容的提问来源于stack exchange,提问作者Gbenga B Ayannuga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:15:02