类型“RenderSliverList”不是类型转换中“RenderBox”类型的子类型 - Flutter

问题描述 投票:0回答:4

大家好,我想实现 flutter popover 插件,我刚刚复制了代码并粘贴到我的项目中,如 popover 插件链接中给出的那样

https://pub.dev/packages/popover

但是当我单击弹出窗口功能时出现此错误

类型“RenderSliverList”不是类型转换中类型“RenderBox”的子类型

在调试模式下显示错误行是

final box = widget.context.findRenderObject() as RenderBox;
flutter dart flutter-dependencies
4个回答
4
投票

您正在使用

context
RenderSliverList
(最肯定类似于
SliverListDelegate
上下文)。

问题是这个上下文是inside滚动视图,所以它的渲染对象不是

RenderBox
而是
RenderSliver

这很重要,因为它们不使用相同的约束,而这正是您想要的。

解决方案是使用不同的上下文,例如使用您的

build
方法之一,它应该可以工作。


2
投票

我只需将 findRenderObject() 更改为 findAncestorRenderObjectOfType()。

这解决了我的问题。使用 findAncestorRenderObjectOfType() 可以让我找到正确类型的最近祖先,从而解决了问题。


1
投票

这个问题似乎与另一个 Stack Overflow 问题有关,该问题也与使用 flutter popover 包有关。我有一个答案,我建议人们在这里查看答案:

类型“RenderSliverList”不是类型转换中类型“RenderBox”的子类型

基本上,您需要将触发小部件(按钮/文本按钮/图标按钮等)包装到一个类中,以便弹出窗口菜单项将使用小部件的上下文,以使弹出窗口出现在触发按钮(小部件)的点击点处。


0
投票

根据@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,
      ));
}),
© www.soinside.com 2019 - 2024. All rights reserved.