didvan-app/lib/widgets/state_handler.dart

49 lines
1.4 KiB
Dart

import 'package:didvan/models/enums.dart';
import 'package:didvan/providers/core_provider.dart';
import 'package:flutter/material.dart';
class StateHandler<T extends CoreProvier> extends StatelessWidget {
final T state;
final Widget Function(BuildContext context, T state) builder;
final VoidCallback? onRefresh;
final bool enableCustomLoadingIndicator;
final Color? customLoadingIndicatorColor;
final bool enableEmptyState;
final Widget? emptyState;
final double topPadding;
const StateHandler({
Key? key,
required this.builder,
this.emptyState,
this.enableCustomLoadingIndicator = false,
this.enableEmptyState = false,
this.onRefresh,
this.topPadding = 0,
this.customLoadingIndicatorColor,
required this.state,
}) : super(key: key);
@override
Widget build(BuildContext context) {
if (enableEmptyState && state.appState == AppState.idle) {
return Container(
padding: EdgeInsets.only(top: topPadding),
alignment: Alignment.center,
child: SingleChildScrollView(
child: emptyState ?? const Text('Custom Widget Required!'),
),
);
}
switch (state.appState) {
case AppState.idle:
return builder(context, state);
case AppState.busy:
return const CircularProgressIndicator();
case AppState.failed:
return enableCustomLoadingIndicator ? emptyState! : Container();
default:
return Container();
}
}
}