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

Flutter:如何在SfRadialGauge信用分仪表盘顶部添加半圆

Syncfusion Flutter 仪表盘添加外层半圆实现方案

基于你引入的syncfusion_flutter_gauges: ^20.1.59版本,可通过以下两种方案快速实现目标效果中外层的浅灰色细半圆,无需引入其他依赖。


方案1:多RadialAxis叠加实现(改动最小,优先推荐)

SfRadialGauge支持同时配置多个径向轴,直接在现有渐变轴外层叠加一个浅灰色细线条轴即可,和原控件适配度最高,不需要自行处理弧度、屏幕适配问题。
直接替换原有CreditScoreGauge代码即可运行:

import 'package:flutter/material.dart';
import 'package:syncfusion_flutter_gauges/gauges.dart';

class CreditScoreGauge extends StatelessWidget {
  const CreditScoreGauge({super.key, this.creditScore = 600});
  final double creditScore;

  @override
  Widget build(BuildContext context) {
    return Container(
      margin: const EdgeInsets.all(20),
      child: SfRadialGauge(
        axes: <RadialAxis>[
          // 外层浅灰色细半圆
          RadialAxis(
            showLabels: false,
            showTicks: false,
            minimum: 300,
            maximum: 850,
            startAngle: 180,
            endAngle: 0,
            radiusFactor: 0.97,
            axisLineStyle: const AxisLineStyle(
              thickness: 0.03,
              cornerStyle: CornerStyle.bothCurve,
              thicknessUnit: GaugeSizeUnit.factor,
              color: Color(0xffE5E7EB),
            ),
          ),
          // 原有渐变进度轴
          RadialAxis(
            showLabels: false,
            showTicks: false,
            minimum: 300,
            maximum: 850,
            startAngle: 180,
            endAngle: 0,
            radiusFactor: 0.9,
            axisLineStyle: const AxisLineStyle(
              thickness: 0.12,
              cornerStyle: CornerStyle.bothCurve,
              thicknessUnit: GaugeSizeUnit.factor,
              gradient: SweepGradient(colors: <Color>[
                Color(0xffa2c9e1),
                Color(0xff62769D),
                Color(0xff354F81),
                Color(0Xff1B3568),
                Color(0xff122345),
              ], stops: <double>[
                0,
                0.35,
                0.7,
                0.8,
                1.0
              ]),
            ),
            pointers: <GaugePointer>[
              MarkerPointer(
                  value: creditScore,
                  markerHeight: 25,
                  markerWidth: 25,
                  markerType: MarkerType.circle,
                  enableDragging: true,
                  color: const Color.fromARGB(0, 3, 168, 244),
                  borderWidth: 7,
                  elevation: 10,
                  borderColor: Colors.white),
            ],
          ),
        ],
      ),
    );
  }
}

核心参数调整说明

  • 外层灰轴设置更大的radiusFactor,保证显示在渐变弧上方
  • 两层轴的角度范围(startAngle/endAngle)、极值(minimum/maximum)完全一致,保证弧度对齐
  • 可通过微调radiusFactor、thickness参数,调整两层弧的间距和线条粗细,匹配设计稿要求

方案2:Stack+CustomPaint 自定义绘制(灵活度最高)

如果后续需要在外层半圆上增加刻度、分段色标等自定义元素,可通过Stack组件叠一层自定义绘制的半圆,可控性更强:

@override
Widget build(BuildContext context) {
  return Container(
    margin: const EdgeInsets.all(20),
    child: Stack(
      alignment: Alignment.center,
      children: [
        // 外层浅灰半圆
        CustomPaint(
          size: const Size(300, 150),
          painter: const _TopArcPainter(),
        ),
        // 原有渐变仪表盘,radiusFactor调整为0.85避免和外层弧重叠
        SfRadialGauge(
          axes: <RadialAxis>[
            RadialAxis(
              showLabels: false,
              showTicks: false,
              minimum: 300,
              maximum: 850,
              startAngle: 180,
              endAngle: 0,
              radiusFactor: 0.85,
              // 此处保留你原有axisLineStyle、pointers的全部配置
            )
          ],
        )
      ],
    ),
  );
}

class _TopArcPainter extends CustomPainter {
  const _TopArcPainter();
  @override
  void paint(Canvas canvas, Size size) {
    final arcPaint = Paint()
      ..color = const Color(0xffE5E7EB)
      ..strokeWidth = 4
      ..style = PaintingStyle.stroke
      ..strokeCap = StrokeCap.round;
    canvas.drawArc(
      Rect.fromLTWH(0, 0, size.width, size.height * 2),
      3.14159, // 180度(弧度制)
      3.14159, // 扫过180度形成半圆
      false,
      arcPaint,
    );
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}

效果参考

  • 当前实现效果:
    当前运行效果
  • 目标预期效果:
    目标预期效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 15:51:22