大家好,我想实现 flutter popover 插件,我刚刚复制了代码并粘贴到我的项目中,如 popover 插件链接中给出的那样
https://pub.dev/packages/popover
但是当我单击弹出窗口功能时出现此错误
类型“RenderSliverList”不是类型转换中类型“RenderBox”的子类型
在调试模式下显示错误行是
final box = widget.context.findRenderObject() as RenderBox;
您正在使用
context
的 RenderSliverList
(最肯定类似于 SliverListDelegate
上下文)。
问题是这个上下文是inside滚动视图,所以它的渲染对象不是
RenderBox
而是RenderSliver
。
这很重要,因为它们不使用相同的约束,而这正是您想要的。
解决方案是使用不同的上下文,例如使用您的
build
方法之一,它应该可以工作。
我只需将 findRenderObject() 更改为 findAncestorRenderObjectOfType()。
这解决了我的问题。使用 findAncestorRenderObjectOfType() 可以让我找到正确类型的最近祖先,从而解决了问题。
这个问题似乎与另一个 Stack Overflow 问题有关,该问题也与使用 flutter popover 包有关。我有一个答案,我建议人们在这里查看答案:
类型“RenderSliverList”不是类型转换中类型“RenderBox”的子类型
基本上,您需要将触发小部件(按钮/文本按钮/图标按钮等)包装到一个类中,以便弹出窗口菜单项将使用小部件的上下文,以使弹出窗口出现在触发按钮(小部件)的点击点处。
根据@Lulupointu的回答,我尝试添加一个构建器来获得不同的上下文
Builder(builder: (context) {
return IconButton(
onPressed: () async {
final box = context.findRenderObject() as RenderBox?;
await Share.share(
subject.title.toString(),
sharePositionOrigin:
box!.localToGlobal(Offset.zero) & box.size,
);
},
icon: const Icon(
Icons.share_outlined,
color: Colors.white,
));
}),