Flutter 中下拉革新必要用到 RefreshIndicator 组件,一样寻常在 ScrollView 或 ListView 外包一层 RefreshIndicator 组件即可。
1. 常见用法
Future _onRefresh() async { //......实现革新逻辑 } @override Widget build(BuildContext context) { return RefreshIndicator( onRefresh: _onRefresh, child: SingleChildScrollView( child: Container(), )); }利用很简朴,只必要实现 onRefresh 函数即可,这也是一个 Future 函数,当该 Future 实行完毕时,革新操纵也就完成了。是不是很希奇,当我们用原生代码写下拉革新时,通常必要界说一个状态来表现革新状态,到 Flutter 这里居然啥都不消管。当触发下拉革新时,就会实行 onRefresh 函数,只要该函数没有实行完毕,UI 上就不停表现的是革新状态,一旦该函数实行完毕,UI 状态也会自动改变成革新完成。
2. 怎么触发自动革新
通常我们进入某个页面时,盼望一进去就会触发自动下拉革新,但是找了一圈发现没有什么属性可设置。颠末一番研究,发现 RefreshIndicator 也是一个有状态组件,我们可直接获取该组件的状态,通过它的状态来手动触发下拉革新。这就必要用到每个 Widget 都会有的 Key 属性了,通过 key 可以得到其对应的状态。具体代码如下:
//自界说 RefreshIndicatorState 范例的 Key final GlobalKey<RefreshIndicatorState> _refreshKey = GlobalKey(); @override void initState() { super.initState(); //必须在组件挂载运行的第一帧后实行,否则 _refreshKey 还没有与组件状态关联起来 WidgetsBinding.instance.addPostFrameCallback((timeStamp) { //关键代码,直打仗发下拉革新 _refreshKey.currentState?.show(); }); } Future _onRefresh() async { //......实现革新逻辑 } @override Widget build(BuildContext context) { return RefreshIndicator( key: _refreshKey, //自界说 key,必要通过 key 获取到对应的 State onRefresh: _onRefresh, child: SingleChildScrollView( child: Container(), )); }3. 页面不能滚动时无法触发下拉革新
假如页面内容很少,在一屏内不能滚动,你会发现无法触发下拉革新。办理这个标题,必要设置 ScrollView 的 physics 属性。
终极完备办理方案如下:
//自界说 RefreshIndicatorState 范例的 Key final GlobalKey<RefreshIndicatorState> _refreshKey = GlobalKey(); @override void initState() { super.initState(); //必须在组件挂载运行的第一帧后实行,否则 _refreshKey 还没有与组件状态关联起来 WidgetsBinding.instance.addPostFrameCallback((timeStamp) { //关键代码,直打仗发下拉革新 _refreshKey.currentState?.show(); }); } Future _onRefresh() async { //......实现革新逻辑 } @override Widget build(BuildContext context) { return RefreshIndicator( key: _refreshKey, //自界说 key,必要通过 key 获取到对应的 State onRefresh: _onRefresh, child: SingleChildScrollView( physics: const AlwaysScrollableScrollPhysics(), child: Container(), )); }默认环境下,当 ScrollView 包裹的内容太少时,是不会触发滚动事故的,如许也就不会触发下拉革新。AlwaysScrollableScrollPhysics 则可以在这种环境下,触发滚动事故。 |