123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- import 'package:cs_resources/generated/assets.dart';
- import 'package:cs_resources/theme/app_colors_theme.dart';
- import 'package:flutter/material.dart';
- import 'package:cs_resources/constants/color_constants.dart';
- import 'my_load_image.dart';
- import 'my_text_view.dart';
- enum LoadState { State_Success, State_Error, State_Loading, State_Empty }
- class LoadStateLayout extends StatefulWidget {
- final LoadState state;
- final Widget? successWidget;
- final List<Widget>? successSliverWidget;
- ScrollController? sliverScrollController;
- final VoidCallback? errorRetry;
- final Color? themeColor;
- String? errorMessage;
- LoadStateLayout({
- Key? key,
- this.state = LoadState.State_Loading,
- this.successWidget,
- this.successSliverWidget,
- this.sliverScrollController,
- this.errorMessage,
- this.errorRetry,
- this.themeColor,
- }) : super(key: key);
- @override
- _LoadStateLayoutState createState() => _LoadStateLayoutState();
- }
- class _LoadStateLayoutState extends State<LoadStateLayout> {
- @override
- Widget build(BuildContext context) {
- if (widget.successSliverWidget != null) {
-
- return CustomScrollView(
- controller: widget.sliverScrollController,
- slivers: _buildSlivers(),
- );
- } else {
-
- return SizedBox(
- width: double.infinity,
- height: double.infinity,
- child: _buildWidget(context),
- );
- }
- }
-
- List<Widget> _buildSlivers() {
- return _buildListWidget(context);
- }
-
- Widget _buildWidget(BuildContext context) {
- switch (widget.state) {
- case LoadState.State_Success:
- return widget.successWidget ?? const SizedBox();
- case LoadState.State_Error:
- return _errorView(context);
- case LoadState.State_Loading:
- return _loadingView(context);
- case LoadState.State_Empty:
- return _emptyView(context);
- default:
- return _loadingView(context);
- }
- }
-
- List<Widget> _buildListWidget(BuildContext context) {
- switch (widget.state) {
- case LoadState.State_Success:
- return widget.successSliverWidget != null
- ? widget.successSliverWidget!
- : widget.successWidget != null
- ? [widget.successWidget!]
- : [const SizedBox()];
- case LoadState.State_Error:
- return [widget.successSliverWidget != null ? _warpStateLayout(_errorView(context)) : _errorView(context)];
- case LoadState.State_Loading:
- return [widget.successSliverWidget != null ? _warpStateLayout(_loadingView(context)) : _loadingView(context)];
- case LoadState.State_Empty:
- return [widget.successSliverWidget != null ? _warpStateLayout(_emptyView(context)) : _emptyView(context)];
- default:
- return [widget.successSliverWidget != null ? _warpStateLayout(_loadingView(context)) : _loadingView(context)];
- }
- }
-
- Widget _warpStateLayout(Widget widget) {
- return SliverFillViewport(
- delegate: SliverChildBuilderDelegate(
- (context, index) {
- return widget;
- },
- childCount: 1,
- ),
- );
- }
-
-
- Widget _loadingView(BuildContext context) {
- return Container(
- width: double.infinity,
- height: double.infinity,
- alignment: Alignment.center,
- child: Column(
- mainAxisSize: MainAxisSize.max,
- mainAxisAlignment: MainAxisAlignment.center,
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- CircularProgressIndicator(
- strokeWidth: 3,
- valueColor: AlwaysStoppedAnimation(widget.themeColor ?? context.appColors.textDarkGray),
- ),
- MyTextView(
- 'Loading...',
- marginTop: 15,
- fontSize: 14,
- textColor: widget.themeColor ?? context.appColors.textDarkGray,
- )
- ],
- ),
- );
- }
-
- Widget _errorView(BuildContext context) {
- return Container(
- width: double.infinity,
- height: double.infinity,
- alignment: Alignment.center,
- padding: const EdgeInsets.only(bottom: 10),
- child: GestureDetector(
- onTap: widget.errorRetry,
- child: Column(
- mainAxisSize: MainAxisSize.max,
- crossAxisAlignment: CrossAxisAlignment.center,
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- const MyAssetImage(Assets.baseServicePageLoadError, width: 141, height: 117.5, fit: BoxFit.contain),
- MyTextView(
- widget.errorMessage ?? 'Data loading failed! Please refresh and try again',
- marginTop: 18,
- fontSize: 14,
- textAlign: TextAlign.center,
- textColor: widget.themeColor ?? context.appColors.textDarkGray,
- ),
- ],
- )));
- }
-
- Widget _emptyView(BuildContext context) {
- return Container(
- width: double.infinity,
- height: double.infinity,
- alignment: Alignment.center,
- padding: const EdgeInsets.only(bottom: 10),
- child: Column(
- mainAxisSize: MainAxisSize.max,
- crossAxisAlignment: CrossAxisAlignment.center,
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- const MyAssetImage(Assets.baseServicePageNoData, width: 123.5, height: 115.5, fit: BoxFit.contain),
- MyTextView(
- 'There is currently no content available',
- marginTop: 18,
- fontSize: 14,
- textColor: widget.themeColor ?? context.appColors.textDarkGray,
- ),
- ],
- ),
- );
- }
- }
|