當(dāng)界面復(fù)雜,嵌套多個(gè)子widget時(shí),經(jīng)常有刷新單個(gè)或者局部widget的需求,每次寫業(yè)務(wù)時(shí)創(chuàng)建GlobalKey太繁瑣不夠優(yōu)雅,使用provider狀態(tài)控制類刷新可能功能又過(guò)重。習(xí)慣命令式刷新的同學(xué),可以參考此文
RefreshableStatefulWidget
abstract class RefreshableStatefulWidget extends StatefulWidget {
RefreshableStatefulWidget({Key key})
: super(key: key is GlobalKey ? key : GlobalKey());
void reload() {
if (key is! GlobalKey) {
return;
}
final aKey = key as GlobalKey;
aKey.currentState.setState(() {});
}
}
RefreshableView
class RefreshableView extends RefreshableStatefulWidget {
final Widget Function(BuildContext cntext) builder;
RefreshableView({Key key, @required this.builder})
: assert(builder != null),
super(key: key);
@override
State<StatefulWidget> createState() {
return _RefreshableViewState(builder);
}
}
class _RefreshableViewState extends State<RefreshableView> {
final Widget Function(BuildContext cntext) builder;
_RefreshableViewState(this.builder);
@override
Widget build(BuildContext context) {
return builder(context);
}
}
使用
- 構(gòu)建
_aRefreshableView = RefreshableView(builder: (BuildContext context) {
return ListView.builder(
itemCount: 10,
itemBuilder: (BuildContext context, int index) {
return Text("data$index");
});
});
@override
Widget build(BuildContext context) {
return CupertinoPageScaffold(
navigationBar: _navigationBar,
child: Column(
children: <Widget>[
Text("data"),
Image.asset("image"),
_aRefreshableView
],
));
}
- 刷新
ListView
await request();
_aRefreshableView.reload(); // 網(wǎng)絡(luò)請(qǐng)求回調(diào)后reload
推薦自維護(hù)的一個(gè)Flutter下載器及相關(guān)文章:
al_downloader
Flutter 下載器 al_downloader