当列表未填满整个页面时,刷新指示器不起作用

时间:2019-08-16 06:21:50

标签: flutter dart

我有一个页面,其中有一个带有刷新指示器的列表。当列表中有很多元素时(填充整个视图等等,即可以滚动),刷新指示器将起作用。 但是,当列表中只有一个或两个元素(无滚动内容)时,刷新指示器将不起作用。这是预期的行为吗?有没有办法使指标也适用于短名单?

我尝试用滚动条包装列表视图(刷新指示器的子级),但问题仍然存在。


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,或者不需要滚动的任何数量,刷新指示器也应该起作用。

3 个答案:

答案 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.bottomNavigationBarsizes.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}");
                   }),