2

我正在尝试为应用程序创建一个事件页面,用户可以在其中查看具有横幅图像和其他一些有用信息的事件。我真的很喜欢用横幅实现 SliverAppBar 的想法,这样用户可以滚动查看更多信息。为此,我似乎需要一个带有 SliverAppBar 和 FlexibleSpaceBar 的 CustomScrollView。

我在网上看到的所有教程都假设屏幕的其余部分应该是一个列表,但我更想要一个类似 Column 小部件的东西。但是,Column 具有无限的高度,这会导致 CustomScrollView 中的溢出错误。我可以将它包装在一个具有指定高度的容器中,但是主体的内容是可变大小的,所以这并不理想。有没有办法让 SliverAppBar 和 Column 并排工作?

我想要一些类似的东西:

class ActivityPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(slivers: [
          SliverAppBar(
            flexibleSpace: FlexibleSpaceBar(
              background: Image(someImage),
            ),
            expandedHeight: Image,
            floating: false,
            pinned: true,
            snap: false,
          ),
          Column(
            children: [
              someChildren,
            ]
            ),
          )
        ]),
      ),
    );
  }

这应该是可能的,因为在我看来这是一种常见的模式,但我环顾四周,只能找到正文由列表组成的示例......

4

4 回答 4

4

对于任何有同样困难的人:这是我刚刚找到的解决方案:

Widget build(BuildContext context) {
    return Scaffold(
      body: NestedScrollView(
        headerSliverBuilder:
            (BuildContext context, bool innerBoxIsScrolled) {
          return <Widget>[
            SliverAppBar(
              backgroundColor: this.color,
              flexibleSpace: FlexibleSpaceBar(
              background: YourImage(),
              ),
            )
          ];
          },
        body: Container(
          child: Builder(builder: (context) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.start,
                children: [
                  WidgetOne(),
                  WidgetTwo()
                ]);
          })),
        ),
      )),
    );
  }

于 2020-11-13T10:35:54.847 回答
3

使用SliverListandSliverChildListDelegate而不是Column.

Widget build(BuildContext context) {
  return Scaffold(
    body: CustomScrollView(
      slivers: <Widget>[
        SliverAppBar(
          expandedHeight: 200,
          flexibleSpace: FlexibleSpaceBar(
            background: Container(color: Colors.green),
          ),
        ),
        SliverList(
          delegate: SliverChildListDelegate([
            Container(color: Colors.yellow, height: 400),
            Container(color: Colors.red, height: 800),
          ]),
        ),
      ],
    ),
  );
}
于 2021-08-21T07:34:45.897 回答
2

使用 ListView 而不是 Column。ListView 具有动态大小

于 2021-02-02T06:00:19.230 回答
0

对我来说最好的方法是使用SliverToBoxAdapter. 只需将您的包装Column在 a 中Container,然后将其包装Container在 a 中SliverToBoxAdapter,它应该可以正常工作。

于 2021-07-30T13:42:14.237 回答