如何在 CustomScrollWidget 中使用 StreamBuilder?
How to use StreamBuilder inside CustomScrollWidget?
我正在尝试显示来自 sqlite 的一些数据,一切正常,但我无法在 CustomScrollView 中使用 StreamBuilder,它说:
RenderViewport 需要一个 RenderSliver 类型的子对象,但收到了一个类型的子对象
RenderPositionedBox.
然后我用 SliverPadding 包装了 StreamBuilder(通常 SliverPadding 是由 StreamBuilder 包装的)但是这次它说:
RenderSliverPadding 需要一个 RenderSliver 类型的子节点,但收到了一个 RenderSliver 类型的子节点
RenderPositionedBox.
我尝试使用 SliverToBoxAdapter 并用它包装 StreamBuilder 但没有解决我的问题,所以我该如何实现?
这是我的代码的最后状态:
CustomScrollView(
slivers: <Widget>[
SliverAppBar(
centerTitle: true,
floating: false,
snap: false,
pinned: false,
expandedHeight: 0,
elevation: 3,
forceElevated: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
brightness: Brightness.light,
title: Text(
'Your Lists',
style: GoogleFonts.openSans(
fontSize: 22, fontWeight: FontWeight.bold, color: Colors.black),
),
),
SliverPadding(
padding: EdgeInsets.fromLTRB(16, 16, 16, 74),
sliver: StreamBuilder<List<Category>>(
stream: bloc.getAll().asStream(),
builder: (context, AsyncSnapshot<List<Category>> snapshot) {
if (snapshot.hasData) {
return SliverGrid(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
if (index == snapshot.data.length) {
return ListAddCard();
}
return ListCard(
category: snapshot.data[index],
);
}, childCount: snapshot.data.length + 1),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
childAspectRatio: 1.1),
);
}
return Center(child: CircularProgressIndicator());
}),
)
],
);
这里的问题是 SliverPadding
需要一个 RenderSliverPadding
但你给它一个 RenderPositionedBox
。您可以做的是删除 SliverPadding
并将其包装在 SliverGrid
而不是 StreamBuilder
.
中
试试这个:
StreamBuilder<List<Category>>(
stream: bloc.getAll().asStream(),
builder: (context, AsyncSnapshot<List<Category>> snapshot) {
if (snapshot.hasData) {
return SliverPadding(
padding: EdgeInsets.fromLTRB(16, 16, 16, 74),
sliver: SliverGrid(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
if (index == snapshot.data.length) {
return ListAddCard();
}
return ListCard(
category: snapshot.data[index],
);
}, childCount: snapshot.data.length + 1),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
childAspectRatio: 1.1),),
);
}
return Center(child: CircularProgressIndicator());
}),
解决方法是将整个 CustomScrollView 包装在 Streambuilder 中,而不是相反。在我使用这个策略之前,我一直面临同样的问题。
我正在尝试显示来自 sqlite 的一些数据,一切正常,但我无法在 CustomScrollView 中使用 StreamBuilder,它说:
RenderViewport 需要一个 RenderSliver 类型的子对象,但收到了一个类型的子对象 RenderPositionedBox.
然后我用 SliverPadding 包装了 StreamBuilder(通常 SliverPadding 是由 StreamBuilder 包装的)但是这次它说:
RenderSliverPadding 需要一个 RenderSliver 类型的子节点,但收到了一个 RenderSliver 类型的子节点 RenderPositionedBox.
我尝试使用 SliverToBoxAdapter 并用它包装 StreamBuilder 但没有解决我的问题,所以我该如何实现?
这是我的代码的最后状态:
CustomScrollView(
slivers: <Widget>[
SliverAppBar(
centerTitle: true,
floating: false,
snap: false,
pinned: false,
expandedHeight: 0,
elevation: 3,
forceElevated: true,
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
brightness: Brightness.light,
title: Text(
'Your Lists',
style: GoogleFonts.openSans(
fontSize: 22, fontWeight: FontWeight.bold, color: Colors.black),
),
),
SliverPadding(
padding: EdgeInsets.fromLTRB(16, 16, 16, 74),
sliver: StreamBuilder<List<Category>>(
stream: bloc.getAll().asStream(),
builder: (context, AsyncSnapshot<List<Category>> snapshot) {
if (snapshot.hasData) {
return SliverGrid(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
if (index == snapshot.data.length) {
return ListAddCard();
}
return ListCard(
category: snapshot.data[index],
);
}, childCount: snapshot.data.length + 1),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
childAspectRatio: 1.1),
);
}
return Center(child: CircularProgressIndicator());
}),
)
],
);
这里的问题是 SliverPadding
需要一个 RenderSliverPadding
但你给它一个 RenderPositionedBox
。您可以做的是删除 SliverPadding
并将其包装在 SliverGrid
而不是 StreamBuilder
.
中
试试这个:
StreamBuilder<List<Category>>(
stream: bloc.getAll().asStream(),
builder: (context, AsyncSnapshot<List<Category>> snapshot) {
if (snapshot.hasData) {
return SliverPadding(
padding: EdgeInsets.fromLTRB(16, 16, 16, 74),
sliver: SliverGrid(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
if (index == snapshot.data.length) {
return ListAddCard();
}
return ListCard(
category: snapshot.data[index],
);
}, childCount: snapshot.data.length + 1),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
mainAxisSpacing: 16,
crossAxisSpacing: 16,
childAspectRatio: 1.1),),
);
}
return Center(child: CircularProgressIndicator());
}),
解决方法是将整个 CustomScrollView 包装在 Streambuilder 中,而不是相反。在我使用这个策略之前,我一直面临同样的问题。