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

Flutter中使用Screenshot包捕获Syncfusion图表时遇MediaQuery错误

解决screenshot包捕获Syncfusion图表时的MediaQuery报错问题

问题原因

captureFromWidget 会创建独立的Widget树,默认不包含MediaQuery上下文,而Syncfusion图表组件内部依赖MediaQuery.of()获取布局相关参数,因此抛出找不到MediaQuery祖先的错误。之前的包裹方式未正确传递有效的MediaQuery数据,导致问题持续存在。

解决方案

在待捕获的Widget外层,用当前页面的MediaQueryData包裹整个Widget树,同时提供Material环境(如MaterialApp),确保图表能正常获取所需上下文信息。

修改后的代码示例

// 先获取当前页面的MediaQuery数据
final mediaQueryData = MediaQuery.of(context);

await screenshotController.captureFromWidget(
  MediaQuery(
    data: mediaQueryData,
    child: MaterialApp(
      home: Scaffold(
        body: SfCartesianChart(
          isTransposed: true,
          title: const ChartTitle(text: 'Tonnes Moved by Week Days'),
          legend: const Legend(isVisible: true),
          primaryXAxis: const CategoryAxis(
            title: AxisTitle(text: 'Week Days'),
            majorGridLines: MajorGridLines(width: 0),
            minorGridLines: MinorGridLines(width: 0),
          ),
          primaryYAxis: const NumericAxis(
            title: AxisTitle(text: 'Amount of Tonnes'),
            majorGridLines: MajorGridLines(width: 0),
            minorGridLines: MinorGridLines(width: 0),
          ),
          series: <ChartSeries>[
            StackedBarSeries<ChartData, String>(
              dataSource: getStackedBarData(),
              xValueMapper: (ChartData data, _) => data.weekDay,
              yValueMapper: (ChartData data, _) => data.barValue,
              name: 'Stacked Bar Series',
            ),
            LineSeries<ChartData, String>(
              color: redAlertColor,
              dataSource: getLineData(),
              xValueMapper: (ChartData data, _) => data.weekDay,
              yValueMapper: (ChartData data, _) => data.lineValue,
              name: 'Line Series',
            ),
          ],
        ),
      ),
    ),
  ),
).then((Uint8List? values) async {
  sampleBarChartBytes = values!;
  saveListToFile(sampleBarChartBytes.toString(), "Testing");
});

额外注意事项

  • 若不需要完整Material主题,可使用Material组件替代MaterialApp,同样能提供必要的Material环境。
  • 确认getStackedBarData()和getLineData()返回的数据源格式正确,避免因数据问题引发其他渲染错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:07:50