| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 |
- import 'package:flutter/material.dart';
- import 'package:flutter_screenutil/flutter_screenutil.dart';
- import 'package:flutter_spinkit/flutter_spinkit.dart';
- import 'package:flutter_svg/flutter_svg.dart';
- import 'package:get/get.dart';
- import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
- import '../../../config/translations/strings_enum.dart';
- import '../../constants/assets.dart';
- import '../submit_btn.dart';
- enum SimpleViewState { loading, empty, error, networkError, success }
- class SimpleStateWrapper extends StatelessWidget {
- final Widget child;
- final SimpleViewState state;
- final String? errorMessage;
- final VoidCallback? onRetry;
- final VoidCallback? onRefresh;
- final double? width;
- final double? height;
- // 可选的自定义状态视图
- final Widget Function(BuildContext)? loadingBuilder;
- final Widget Function(BuildContext)? emptyBuilder;
- final Widget Function(BuildContext, String?)? errorBuilder;
- final Widget Function(BuildContext)? networkErrorBuilder;
- const SimpleStateWrapper({
- super.key,
- required this.child,
- required this.state,
- this.errorMessage,
- this.onRetry,
- this.onRefresh,
- this.width,
- this.height,
- this.loadingBuilder,
- this.emptyBuilder,
- this.errorBuilder,
- this.networkErrorBuilder,
- });
- // 默认加载视图
- Widget _defaultLoadingView(BuildContext context) {
- return Center(
- child: SpinKitRing(
- size: 24.w,
- lineWidth: 2.w,
- color: Get.reactiveTheme.primaryColor,
- ),
- );
- }
- // 默认空视图
- Widget _defaultEmptyView(BuildContext context) {
- return Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- SvgPicture.asset(Assets.oops, width: 160.w, height: 160.w),
- Text(
- Strings.noData.tr,
- style: TextStyle(
- fontSize: 14.sp,
- color: Get.reactiveTheme.textTheme.bodyLarge!.color!,
- ),
- ),
- 24.verticalSpaceFromWidth,
- SizedBox(
- width: 247.w,
- child: SubmitSvgButton(
- onPressed: onRefresh ?? () {},
- text: Strings.refresh.tr,
- svgPath: Assets.refersh,
- svgColor: Get.reactiveTheme.textTheme.bodyLarge!.color,
- bgColor: Get.reactiveTheme.primaryColor,
- textColor: Get.reactiveTheme.textTheme.bodyLarge!.color,
- borderColor: Get.reactiveTheme.dividerColor,
- ),
- ),
- 40.verticalSpaceFromWidth,
- ],
- ),
- );
- }
- // 默认错误视图
- Widget _defaultErrorView(BuildContext context, String? error) {
- return Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- SvgPicture.asset(Assets.oops, width: 160.w, height: 160.w),
- Padding(
- padding: EdgeInsets.symmetric(horizontal: 20.w),
- child: Text(
- error ?? Strings.unableToConnectServer.tr,
- style: TextStyle(
- fontSize: 14.sp,
- color: Get.reactiveTheme.textTheme.bodyLarge!.color,
- ),
- ),
- ),
- 24.verticalSpaceFromWidth,
- SizedBox(
- width: 247.w,
- child: SubmitSvgButton(
- onPressed: onRefresh ?? () {},
- text: Strings.retry.tr,
- svgPath: Assets.refersh,
- svgColor: Get.reactiveTheme.textTheme.bodyLarge!.color,
- bgColor: Get.reactiveTheme.primaryColor,
- textColor: Get.reactiveTheme.textTheme.bodyLarge!.color,
- borderColor: Get.reactiveTheme.dividerColor,
- ),
- ),
- 40.verticalSpaceFromWidth,
- ],
- ),
- );
- }
- // 网络错误视图
- Widget _defaultNetworkErrorView(BuildContext context) {
- return Center(
- child: Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: [
- SvgPicture.asset(Assets.oops, width: 160.w, height: 160.w),
- Padding(
- padding: EdgeInsets.symmetric(horizontal: 20.w),
- child: Text(
- Strings.unableToConnectNetwork.tr, // 需要添加网络错误文案
- style: TextStyle(
- fontSize: 12.sp,
- color: Get.reactiveTheme.textTheme.bodyLarge!.color,
- ),
- ),
- ),
- 24.verticalSpaceFromWidth,
- SizedBox(
- width: 247.w,
- child: SubmitSvgButton(
- onPressed: onRefresh ?? () {},
- text: Strings.retry.tr,
- svgPath: Assets.refersh,
- svgColor: Get.reactiveTheme.textTheme.bodyLarge!.color,
- bgColor: Get.reactiveTheme.primaryColor,
- textColor: Get.reactiveTheme.textTheme.bodyLarge!.color,
- borderColor: Get.reactiveTheme.dividerColor,
- ),
- ),
- 40.verticalSpaceFromWidth,
- ],
- ),
- );
- }
- @override
- Widget build(BuildContext context) {
- return SizedBox(
- width: width,
- height: height,
- child: Builder(
- builder: (context) {
- switch (state) {
- case SimpleViewState.loading:
- return loadingBuilder?.call(context) ??
- _defaultLoadingView(context);
- case SimpleViewState.empty:
- return emptyBuilder?.call(context) ?? _defaultEmptyView(context);
- case SimpleViewState.error:
- return errorBuilder?.call(context, errorMessage) ??
- _defaultErrorView(context, errorMessage);
- case SimpleViewState.networkError:
- return networkErrorBuilder?.call(context) ??
- _defaultNetworkErrorView(context);
- case SimpleViewState.success:
- return child;
- }
- },
- ),
- );
- }
- }
|