我有一个页面,其中有一个带有刷新指示器的列表。当列表中有很多元素时(填充整个视图等等,即可以滚动),刷新指示器将起作用。 但是,当列表中只有一个或两个元素(无滚动内容)时,刷新指示器将不起作用。这是预期的行为吗?有没有办法使指标也适用于短名单?
我尝试用滚动条包装列表视图(刷新指示器的子级),但问题仍然存在。
Future<void> _onRefresh() async {
_getPeople();
}
@override
Widget build(BuildContext context) {
super.build(context);
return new Container(
child: _items.length == 0
? Center(child: CircularProgressIndicator())
: new RefreshIndicator(
onRefresh: _onRefresh,
child: Scrollbar(
child: new ListView.builder(
controller: controller,
itemBuilder: (context, index) {
return PeopleCard(
People: _items[index],
source: 2,
);
},
itemCount: _items.length,
),
)),
);
}
如果项目列表的长度是1或2,或者不需要滚动的任何数量,刷新指示器也应该起作用。
答案 0 :(得分:3)
就像下面的代码一样,将物理设置为 AlwaysScrollableScrollPhysics 。
new RefreshIndicator(
key: _refreshIndicatorKey,
color: Colors.blue,
onRefresh: (){
setState(() {
_future = fetchPosts(http.Client());
_getAvalailableSlots();
});
},
child: ListView.builder(
physics: AlwaysScrollableScrollPhysics(),
itemCount: data.length,
itemBuilder: (context, i) {
//do something
}
)
)
答案 1 :(得分:0)
要使 RefreshIndicator 始终显示,请为可滚动子项设置 physics: const AlwaysScrollableScrollPhysics()
,如下所示。
ListView(
physics: const AlwaysScrollableScrollPhysics(),
children: <Widget>[widget.bodyWidget]
)
如果您仍有一些错误,以下内容可能会有所帮助。
ListView
小部件需要具有高度值才能“始终”垂直滚动。所以用 SizedBox
或其他适当的小部件包裹它并设置高度。MediaQuery.of(context).size.height
获取视口的高度,如果需要,减去不可滚动部分的值。SingleChildScrollView
而它不适用于 AlwaysScrollableScrollPhysics()
,那是因为孩子没有身高。固定孩子的身高或仅使用 ListView
。总而言之,以下对我有用。
sizes.bottomNavigationBar
和 sizes.appBar
是我用来自定义应用栏和导航栏的常量变量。
RefreshIndicator(
onRefresh: widget.onRefresh,
child: SizedBox(
height: MediaQuery.of(context).size.height -
sizes.bottomNavigationBar -
sizes.appBar,
child: ListView(
physics: const AlwaysScrollableScrollPhysics(),
children: <Widget>[widget.bodyWidget]
)),
)
如果您发现任何可靠性,官方文档的 Refresh indicator does not show up 部分会有所帮助。
答案 2 :(得分:0)
与 BouncingScrollPhysics 一起使用:
RefreshIndicator(
onRefresh: () async {
},
child: ListView.builder(
physics: BouncingScrollPhysics(
parent: AlwaysScrollableScrollPhysics()),
itemBuilder: (context, index) {
return Text("${index}");
}),