在没有 ListView 等的情况下刷新 Flutter 中的小部件或页面

Posted

技术标签:

【中文标题】在没有 ListView 等的情况下刷新 Flutter 中的小部件或页面【英文标题】:Refresh widget or page in Flutter without ListView et al 【发布时间】:2019-11-21 18:42:10 【问题描述】:

我想在没有可滚动内容的情况下刷新我的页面,即没有ListView 等。

当我想使用RefreshIndicator 时,文档说它需要一个scrollable 小部件,例如ListView

但如果我想刷新并想使用RefreshIndicator 的刷新动画而不使用ListViewGridView 或任何其他可滚动小部件,我该怎么做?

【问题讨论】:

添加 SingleChildScrollView 作为小部件的父级,因为您需要一个可滚动的小部件 【参考方案1】:

你可以直接使用GestureDetector,我已经为你创建了一个示例,但它并不完美,你可以根据自己的需要自定义它,它只会检测你何时从顶部滑动。

class Test extends StatefulWidget 
  @override
  _TestState createState() => _TestState();


class _TestState extends State<Test> 

  var refresh=false;

  void  refreshData()
    if(!refresh)
      refresh=true;
      print("Refreshing");
      Future.delayed(Duration(seconds: 4),()
        refresh =false;
        print("Refreshed");
      );
    
  



  @override
  Widget build(BuildContext context) 
    return Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          title: Text("Test"),
          centerTitle: true,
        ),
        body: GestureDetector(
          child: Container(
            color: Colors.yellow,
            height: double.infinity,
            width: double.infinity,
            child: Center(child: Text('TURN LIGHTS ON')),
          ),
          onVerticalDragUpdate: (DragUpdateDetails details)
            print("direction $details.globalPosition.direction");
            print("distance $details.globalPosition.distance");
            print("dy $details.globalPosition.dy");
            if(details.globalPosition.direction < 1 && (details.globalPosition.dy >200 && details.globalPosition.dy < 250))

              refreshData();

            
          ,
        ));
  
 

【讨论】:

【参考方案2】:

您可以简单地将内容包装在SingleChildScrollView 中,这样您就可以使用RefreshIndicator。为了使下拉刷新交互起作用,您必须使用AlwaysScrollableScrollPhysics,因为如果没有滚动视图,您的内容很可能不会覆盖比可用空间更多的空间:

RefreshIndicator(
      onRefresh: () async 
        // Handle refresh.
      ,
      child: SingleChildScrollView(
        physics: const AlwaysScrollableScrollPhysics(),
        child: /* your content */,
      ),
    );

【讨论】:

以上是关于在没有 ListView 等的情况下刷新 Flutter 中的小部件或页面的主要内容,如果未能解决你的问题,请参考以下文章

在android中刷新整个listview [重复]

如何动态刷新 ListView? [复制]

【delphi】动态刷新listview,如果条目过多,会出问题,求解

listview下拉刷新

listview刷新焦点问题

winform。 listview 更新数据后刷新