这是我想要实现的模型 - 它是 CupertinoSliverNavigationBar 下方的 CupertinoActivityIndicator,用于通知用户正在下载数据。
下载后,它应该如下所示:
现在,我一直在尝试使用以下代码来获得这种效果:
List<Trade> trades = [];
showLoadingDialog() {
return trades.length == 0;
}
getBody() {
if (showLoadingDialog()) {
return getProgressDialog();
} else {
return getTradeItemList();
}
}
getTradeItemList() {
return new CupertinoPageScaffold(
child: new CustomScrollView(slivers: <Widget>[
const CupertinoSliverNavigationBar(
largeTitle: const Text('Coffee Shop'),
),
getBody(),
]));
}
getProgressDialog() {
return new Container(
decoration: const BoxDecoration(
color: CupertinoColors.white,
),
child: new Center(child: const CupertinoActivityIndicator()));
}
但是,我收到此错误是因为我试图将非 RenderSliver 类型放入 Sliver。换句话说,我将 CupertinoActivityIndicator 放入 Sliver 并且代码拒绝它。
theftion trible tribrars捕获的例外╞═════════════════════════════════════════ ══════════════════ 在构建Container(bg: BoxDecoration(color: Color(0xffffffff)))时抛出了以下断言:A RenderViewport 需要一个RenderSliver类型的子级,但收到了一个RenderDecoratedBox 类型的子级。RenderObjects 期望特定类型的子对象,因为它们在布局和绘制过程中与子对象协调。例如,RenderSliver 不能是 RenderBox 的子级,因为 RenderSliver 不理解 RenderBox 布局协议。
最接近我想要的效果显示在下面的 gif 中。但是,您可以清楚地看到,当 CupertinoActivityIndicator 可见时,CupertinoSliverNavigationBar 并未显示。只有在下载数据后,显示“Coffee Shop”的 CupertinoSliverNavigationBar 才可见。
我使用以下代码实现了上述目标:
List<Trade> trades = [];
showLoadingDialog() {
return trades.length == 0;
}
getBody() {
if (showLoadingDialog()) {
return getProgressDialog();
} else {
return getTradeItemList();
}
}
getProgressDialog() {
return new Container(
decoration: const BoxDecoration(
color: CupertinoColors.white,
),
child: new Center(child: const CupertinoActivityIndicator()));
}
getTradeItemList() {
return new CupertinoPageScaffold(
child: new CustomScrollView(
slivers: <Widget>[
const CupertinoSliverNavigationBar(
largeTitle: const Text('Coffee Shop'),
),
new SliverPadding(
// Top media padding consumed by CupertinoSliverNavigationBar.
// Left/Right media padding consumed by Tab1RowItem.
padding: MediaQuery
.of(context)
.removePadding(
removeTop: true,
removeLeft: true,
removeRight: true,
)
.padding,
sliver: new SliverList(
delegate: new SliverChildBuilderDelegate(
(BuildContext context, int index) {
return new Tab1RowItem(
index: index,
lastItem: index == trades.length - 1,
color: "Coffee Beans",
colorName: "Buy coffee now",
);
},
childCount: trades.length,
),
),
)
],
),
);
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return getBody();
}
@override
void initState() {
super.initState();
loadDataTrades();
}
谁能告诉我如何才能达到我想要的效果?