51 lines
1.4 KiB
Dart
51 lines
1.4 KiB
Dart
import 'package:didvan/models/enums.dart';
|
|
import 'package:didvan/providers/core_provider.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_spinkit/flutter_spinkit.dart';
|
|
|
|
class StateHandler<T extends CoreProvier> extends StatelessWidget {
|
|
final T state;
|
|
final Widget Function(BuildContext context, T state) builder;
|
|
final VoidCallback? onRefresh;
|
|
final bool enableEmptyState;
|
|
final Widget? placeholder;
|
|
final Widget? emptyState;
|
|
final double topPadding;
|
|
const StateHandler({
|
|
Key? key,
|
|
required this.builder,
|
|
this.emptyState,
|
|
this.enableEmptyState = false,
|
|
this.onRefresh,
|
|
this.topPadding = 0,
|
|
required this.state,
|
|
this.placeholder,
|
|
}) : 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 placeholder ??
|
|
SpinKitSpinningLines(
|
|
color: Theme.of(context).colorScheme.primary,
|
|
);
|
|
case AppState.failed:
|
|
return Container();
|
|
default:
|
|
return Container();
|
|
}
|
|
}
|
|
}
|