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

Flutter中调用captureFromWidget截图时触发NoSuchMethodError求助

问题分析与解决

问题原因

直接调用captureFromWidget(BlinkSkjerm())时,BlinkSkjerm未处于应用的Widget树中,无法获取包含InheritedDataProvider的上下文。这导致InheritedDataProvider.of(context)返回null,后续访问provider.historikken等属性时触发NoSuchMethodError。

解决方案

截图时需将BlinkSkjerm包裹在InheritedDataProvider实例中,确保它能正确获取所需的继承数据。修改触发截图的代码如下:

onPressed: () async {
  final controller = ScreenshotController();
  // 获取当前上下文的InheritedDataProvider实例
  final provider = InheritedDataProvider.of(context);
  // 用provider包裹要截图的Widget,模拟原有Widget树结构
  final bytes = await controller.captureFromWidget(
    InheritedDataProvider(
      // 传递当前provider的状态数据,保证和界面显示一致
      historikken: provider.historikken,
      index: provider.index,
      child: BlinkSkjerm(),
    ),
  );
  setState(() {
    this.bytes = bytes;
  });
}

同时确保InheritedDataProvider支持通过构造函数传递数据,示例定义如下:

class InheritedDataProvider extends InheritedWidget {
  final List historikken;
  final int index;

  const InheritedDataProvider({
    super.key,
    required this.historikken,
    required this.index,
    required super.child,
  });

  static InheritedDataProvider of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<InheritedDataProvider>()!;
  }

  @override
  bool updateShouldNotify(covariant InheritedDataProvider oldWidget) {
    return historikken != oldWidget.historikken || index != oldWidget.index;
  }
}

这样截图时BlinkSkjerm就能正确获取InheritedDataProvider实例,避免null调用错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:21:58