颤动:使用RefreshIndicator时没有刷新指示器

mia*_*shu 2 pull-to-refresh flutter

我在页面上添加了RefreshIndicator,但是在刷新时没有可见的指示器。代码如下:

class HomePage extends StatefulWidget {
  HomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<HomePage> {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: LocalGalleryTab(),
    );
  }
}

class LocalGalleryTab extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _LocalGalleryState();
  }
}

class _LocalGalleryState extends State<LocalGalleryTab> {
  @override
  Widget build(BuildContext context) {
    return new Container(child: new Center(
      child: new RefreshIndicator(
        child: Text("Local Gallery"),
        onRefresh: _refreshLocalGallery,
      ),
    ));
  }

  Future<Null> _refreshLocalGallery() async{
    print('refreshing stocks...');

  }
}
Run Code Online (Sandbox Code Playgroud)

如何使用RefreshIndicator?Flutter 文档没有提供太多信息。

Ven*_*h A 80

默认情况下,刷新指示器不适用于短列表,因此将以下内容添加到 ListView.builder

physics: const AlwaysScrollableScrollPhysics(),
Run Code Online (Sandbox Code Playgroud)

  • 这将解决它并且是正确的答案。使用此功能将为每个平台保持正确的滚动物理效果。 (7认同)

Par*_*iya 37

使用AlwaysScrollableScrollPhysics()将确保滚动视图始终可滚动,因此可以触发RefreshIndicator.

现在我认为创建滚动物理BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics)而不仅仅是AlwaysScrollableScrollPhysics()滚动物理。因为 BouncingScrollPhysics 适用于反弹的短列表。现在需要为预期的行为包含 AlwaysScrollableScrollPhysics。

RefreshIndicator(
    onRefresh: _onRefresh,
    child: ListView(
      padding: EdgeInsets.all(8.0),
      physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
      children: _listData.map((i) {
        return ListTile(
          title: Text("Item $i"),
        );
      }).toList(),
    )
);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


ahm*_*tab 27

根据设计,RefreshIndicator适用于ListView.

但是,如果你想使用RefreshIndicator非滚动的小部件,你可以用你的widget到StackListView

RefreshIndicator(
  onRefresh: () {},
  child: Stack(
    children: <Widget>[ListView(), YOUR_CHILD_WIDGET],
  ),
),
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用。 (4认同)

小智 18

RefreshIndicator(
   onRefresh: _onRefresh,
   child:SingleChildScrollView(
   physics: AlwaysScrollableScrollPhysics(),
   child: ListView(
   padding: EdgeInsets.all(8.0),

   children: _listData.map((i) {
    return ListTile(
      title: Text("Item $i"),
    );
  }).toList(),
 )
)
);
Run Code Online (Sandbox Code Playgroud)

在 SingleChildScrollView 中添加物理

  • 这个解决方案非常有帮助。(+1) (4认同)

小智 7

您需要在其中添加滚动子项,RefreshIndicator 请参见下面的示例

在此处输入图片说明

class HomePage extends StatefulWidget {
  HomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<HomePage> {

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: LocalGalleryTab(),
    );
  }
}

class LocalGalleryTab extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _LocalGalleryState();
  }
}

class _LocalGalleryState extends State<LocalGalleryTab> {
  @override
  Widget build(BuildContext context) {
    return new Container(child: new Center(
      child: new RefreshIndicator(
        child: ListView(
          children: List.generate(50,  (f) => Text("Item $f")),
        ),
        onRefresh: _refreshLocalGallery,
      ),
    ));
  }

  Future<Null> _refreshLocalGallery() async{
    print('refreshing stocks...');

  }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是补充一下:当项目占据的高​​度小于父高度时,刷新指示器可能不起作用。这是因为,当项目占用的空间小于父项时,不允许滚动,并且只有当子项允许滚动时,刷新指示器才允许刷新。检查@Paresh Mangukiya 的回答 (4认同)
  • 它不适用于 ListView.builder!还有其他选择吗? (2认同)