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
相关产品推荐
相关产品推荐

