class AsyncUpdateUI<T> extends StatefulWidget {
const AsyncUpdateUI({Key? key,required this.future,required this.child,this.errorOnPressed}) : super(key: key);
final Widget child;
final void Function()? errorOnPressed;
final Future<T>? future;
@override
State<AsyncUpdateUI> createState() => _AsyncUpdateUIState();
}
class _AsyncUpdateUIState extends State<AsyncUpdateUI> {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: widget.future,
builder: (context, asyncSnapshot){
switch(asyncSnapshot.connectionState){
case ConnectionState.none:
case ConnectionState.waiting:
case ConnectionState.active:
return buildProgressWidget();
case ConnectionState.done:{
if (asyncSnapshot.hasError){
return buildErrorWidget();
}
ZZResult result = asyncSnapshot.data as ZZResult;
if(result.code != 200){
return buildErrorWidget();
}
return widget.child;
}
}
});
}
/// 加载中。。。
Widget buildProgressWidget(){
return Align(child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Expanded(flex:1,child: Container()),
const CircularProgressIndicator(),
SizedBox(height: 30.w,),
ZZWidget.text("数据加载中......"),
Expanded(flex: 2, child: Container()),
],),);
}
/// 加载失败。。。
Widget buildErrorWidget(){
return Center(child: Column(children: [
Expanded(flex:1,child: Container()),
Icon(Icons.error,size: 44.w,),
SizedBox(height: 30.w,),
OutlinedButton.icon(onPressed: widget.errorOnPressed, label: ZZWidget.text("重新加载"), icon: const Icon(Icons.refresh,color: ZZColor.gray28,),),
Expanded(flex: 2, child: Container()),
],),);
}
}
Flutter 开发之FutureBuilder异步更新 UI 简单封装
最新推荐文章于 2024-06-04 15:18:53 发布