将容器添加到 Sliver

Ben*_*min 5 flutter flutter-sliver

我刚刚开始了解 slivers,除了那些以“Sliver”开头的小部件之外,它们似乎不能与任何其他 Flutter 小部件一起使用。我尝试添加一个,Container以便我可以添加BorderRadius来装饰列表。但我收到了这个错误:

RenderSliv​​erFillRemaining 需要 RenderBox 类型的子代,但收到 RenderSliv​​erToBoxAdapter 类型的子代。

到目前为止,这是我的代码:

...
SliverFillRemaining(
  child: SliverToBoxAdapter(
    child: Container(
      decoration: BoxDecoration(
        borderRadius: BorderRadius.only(
          topLeft: Radius.circular(36),
          topRight: Radius.circular(36),
        ),
      ),
      child: SliverPadding(
        padding: const EdgeInsets.all(16),
        sliver: SliverFixedExtentList(
          itemExtent: 50.0,
          delegate: SliverChildBuilderDelegate(
            (BuildContext context, int index) {
              return Container(
                alignment: Alignment.center,
                color: Colors.lightBlue[100 * (index % 9)],
                child: Text('List Item $index'),
              );
            },
          ),
        ),
      ),
    ),
  ),
),
...
Run Code Online (Sandbox Code Playgroud)

Ben*_*min 6

我通过使用 aNestedScrollView而不是 a解决了我的问题CustomScrollView

return Scaffold(
  body: NestedScrollView(
    headerSliverBuilder: (context, innerBoxIsScrolled) {
      return <Widget>[
        SliverAppBar(
          floating: false,
          pinned: true,
          snap: false,
          elevation: 0,
          expandedHeight: 150.0,
          brightness: DynamicTheme.of(context).brightness,
          flexibleSpace: FlexibleSpaceBar(
            title: Text(assignment.name),
          ),
        ),
      ];
    },
    body: Container(
      decoration: BoxDecoration(
        color: Colors.red,
        borderRadius: BorderRadius.only(
          topLeft: Radius.circular(36),
          topRight: Radius.circular(36),
        ),
      ),
      child: ListView.builder(
        itemExtent: 50.0,
        itemBuilder: (context, index) {
          return Container(
            alignment: Alignment.center,
            color: Colors.lightBlue[100 * (index % 9)],
            child: Text('List Item $index'),
          );
        },
      ),
    ),
  ),
);
Run Code Online (Sandbox Code Playgroud)


dlo*_*ani 0

[更新]根据您的用例,我认为您甚至不需要 SliverFillRemaining,如果您希望 SliverFillRemaining 内的列表是无限的,只需将 SliverList 与 SliverChildBuilderDelegate 一起使用

...
    SliverFixedExtentList(
      itemExtent: 50.0,
      delegate: SliverChildBuilderDelegate(
        (BuildContext context, int index) {
          return Container(
            alignment: Alignment.center,
            color: Colors.lightBlue[100 * (index % 9)],
            child: Text('List Item $index'),
          );
        },
      ),
    ),
    ...
Run Code Online (Sandbox Code Playgroud)

以前的

您已经在错误中得到了答案,您 SliverFillRemaining 不使用 sliver,它使用应该是 widget 的 child

...
SliverFillRemaining(
    hasScrollBody: true,
    child: Container(
      decoration: BoxDecoration(
        borderRadius: BorderRadius.only(
          topLeft: Radius.circular(36),
          topRight: Radius.circular(36),
        ),
      ),
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: ListView.builder(
          itemCount: 20,
          physics: NeverScrollableScrollPhysics(), //adding this line will disable the scrolling and listview and so the CustomScrollView should work as a single scroll view
          itemBuilder: (_, __) => ListTile(
            title: Text("Item"),
          ),
        ),
      ),
    ),
  ),
...
Run Code Online (Sandbox Code Playgroud)