给出水平视口的 PageView.builder 给出了无限的高度错误

Ric*_*ick 8 dart flutter flutter-layout

我对颤振很陌生,我正在尝试学习如何创建视图。我试图创建一个单独的视图文件或小部件,如果它是在颤振中调用的,并且只需从 main.dart 调用它。

我有一个包含此代码的单独小部件

class PageEntryWidgetMain extends StatefulWidget {
  final PageViewEntryMain pageViewEntryMain;

  const PageEntryWidgetMain({Key key, this.pageViewEntryMain})
      : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return _PageEntryWidgetMainState();
  }
}

class _PageEntryWidgetMainState extends State<PageEntryWidgetMain> {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Row(
        children: <Widget>[
          Text(widget.pageViewEntryMain.title)
        ],
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用带有以下代码的视图寻呼机来显示它

return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            PageView.builder(
              itemBuilder: (context, position) {
                PageEntryWidgetMain(
                  pageViewEntryMain: pages[position],
                );
              },
              itemCount: pages.length,
              scrollDirection: Axis.horizontal,
            )
          ],
        ),
      ),
    );
Run Code Online (Sandbox Code Playgroud)

但它给了我以下错误

  • 水平视口被赋予无限的高度。
  • 视口在横轴上扩展以填充其容器并约束其子项以匹配其在横轴上的范围。在这种情况下,水平视口被赋予无限量的垂直空间来扩展。

我对它实际抱怨的内容有些困惑。通过用此代码替换 PageView.builder,我可以只显示一个视图

PageEntryWidgetMain(pageViewEntryMain: pages[0])
Run Code Online (Sandbox Code Playgroud)

所以我相信单独的小部件本身没有问题。这可能是关于我如何尝试使用给我错误的 ViewPager。

我一直在寻找 PageView 实现,但我还没有看到一个实际上有一个单独的视图来调用显示的实现。我需要以这种方式学习它,这样我才能将视图分开,而不仅仅是将它们全部写在一个文件中。

gre*_*ora 19

PageView不能是 的直接子代Column。更改您的列以在Expanded两者之间添加一个,如下所示:

Column(
  children: <Widget>[
    Expanded(
      child: PageView.builder(),
    ),
  ]
)
Run Code Online (Sandbox Code Playgroud)

为了解释这里发生的事情,Column有一个无限的水平宽度,即它会继续水平扩展以占用它孩子需要的尽可能多的空间。PageView(和任何其他水平滚动小部件)需要水平约束才能使滚动逻辑工作。

ExpandedPageView通过占用尽可能多的空间来限制 的水平尺寸,这应该可以解决问题。


小智 6

您可以使用任何具有固定高度和宽度的Widget来包装 PageView

例如,我使用Container()

Column(
  children: <Widget>[
    Container(
      width: double.infinity,
      height: 100.0,
      child: PageView.builder(),
    ),
  ]
)
Run Code Online (Sandbox Code Playgroud)