如何实现嵌套条子?包含条子列表的条子
How to achieve nested slivers? A sliver containing a list of slivers
SliverList
是一个包含框小部件的条子。是否有包含 sliver widget 的 sliver?
我正在尝试嵌套 flutter_sticky_headers 以创建时间线,但 SliverStickyHeader
只接受单个条子作为参数(参见 monthSlivers()
中的评论)。
class HomeView extends StatelessWidget {
final HomeViewModel viewModel;
HomeView(this.viewModel);
List<Widget> entryTiles(List<EntryTileViewModel> entryVMs) {
return entryVMs.map((entryVM) => EntryTile(viewModel: entryVM)).toList();
}
List<Widget> daySlivers(List<DaySection> daySections) {
return daySections.map((daySection) {
var entries = entryTiles(daySection.entryVMs);
return SliverStickyHeader(
overlapsContent: true,
header: DayHeader(
viewModel: DayHeaderViewModel(date: daySection.date),
),
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(context, i) => entries[i],
childCount: entries.length,
),
),
);
}).toList();
}
List<Widget> monthSlivers() {
return viewModel.monthSections.map((monthSection) {
var days = daySlivers(monthSection.daySections);
return SliverStickyHeader(
header: MonthHeader(
viewModel: MonthHeaderViewModel(date: monthSection.date),
),
sliver:,// THIS IS WHERE I WANT TO PUT DAYSLIVERS().
);
}).toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: CustomScrollView(
slivers: monthSlivers(),
),
);
}
}
我现在正在我的项目中使用它
class SliverSection extends StatelessWidget {
final List<Widget> slivers;
const SliverSection({Key key, this.slivers}) : super(key: key);
@override
Widget build(BuildContext context) {
return SliverToBoxAdapter(
child: ShrinkWrappingViewport(
offset: ViewportOffset.zero(),
slivers: slivers,
),
);
}
}
没试过影响性能
您可以将 CustomScrollView()
与 slivers 一起用作命名参数,它接收 slivers 列表或 NestedScrollView()
您可以使用 sliver_tools
包。它有一个名为 MultiSliver
的小部件,您可以通过它获得想要的结果。如文档所述:
The MultiSliver widget allows for grouping of multiple slivers
together such that they can be returned as a single widget. For
instance when one wants to wrap a few slivers with some padding or an
inherited widget.
这是一个例子:
class WidgetThatReturnsASliver extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiSliver(
children: <Widget>[
SliverPersistentHeader(...),
SliverList(...),
],
);
}
}
或者您可以在 CustomScrollView
中使用它:
CustomScrollView(
slivers:[
MultiSliver(
SliverList(...),
SliverGrid(...),
...
)
]
)
SliverList
是一个包含框小部件的条子。是否有包含 sliver widget 的 sliver?
我正在尝试嵌套 flutter_sticky_headers 以创建时间线,但 SliverStickyHeader
只接受单个条子作为参数(参见 monthSlivers()
中的评论)。
class HomeView extends StatelessWidget {
final HomeViewModel viewModel;
HomeView(this.viewModel);
List<Widget> entryTiles(List<EntryTileViewModel> entryVMs) {
return entryVMs.map((entryVM) => EntryTile(viewModel: entryVM)).toList();
}
List<Widget> daySlivers(List<DaySection> daySections) {
return daySections.map((daySection) {
var entries = entryTiles(daySection.entryVMs);
return SliverStickyHeader(
overlapsContent: true,
header: DayHeader(
viewModel: DayHeaderViewModel(date: daySection.date),
),
sliver: SliverList(
delegate: SliverChildBuilderDelegate(
(context, i) => entries[i],
childCount: entries.length,
),
),
);
}).toList();
}
List<Widget> monthSlivers() {
return viewModel.monthSections.map((monthSection) {
var days = daySlivers(monthSection.daySections);
return SliverStickyHeader(
header: MonthHeader(
viewModel: MonthHeaderViewModel(date: monthSection.date),
),
sliver:,// THIS IS WHERE I WANT TO PUT DAYSLIVERS().
);
}).toList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: CustomScrollView(
slivers: monthSlivers(),
),
);
}
}
我现在正在我的项目中使用它
class SliverSection extends StatelessWidget {
final List<Widget> slivers;
const SliverSection({Key key, this.slivers}) : super(key: key);
@override
Widget build(BuildContext context) {
return SliverToBoxAdapter(
child: ShrinkWrappingViewport(
offset: ViewportOffset.zero(),
slivers: slivers,
),
);
}
}
没试过影响性能
您可以将 CustomScrollView()
与 slivers 一起用作命名参数,它接收 slivers 列表或 NestedScrollView()
您可以使用 sliver_tools
包。它有一个名为 MultiSliver
的小部件,您可以通过它获得想要的结果。如文档所述:
The MultiSliver widget allows for grouping of multiple slivers together such that they can be returned as a single widget. For instance when one wants to wrap a few slivers with some padding or an inherited widget.
这是一个例子:
class WidgetThatReturnsASliver extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiSliver(
children: <Widget>[
SliverPersistentHeader(...),
SliverList(...),
],
);
}
}
或者您可以在 CustomScrollView
中使用它:
CustomScrollView(
slivers:[
MultiSliver(
SliverList(...),
SliverGrid(...),
...
)
]
)