didvan-app/lib/widgets/state_handlers/state_handler.dart

52 lines
1.5 KiB
Dart

import 'package:didvan/models/enums.dart';
import 'package:didvan/providers/core_provider.dart';
import 'package:didvan/widgets/state_handlers/empty_connection.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 onRetry;
final bool enableEmptyState;
final Widget? placeholder;
final Widget? emptyState;
final double topPadding;
const StateHandler({
Key? key,
required this.builder,
required this.onRetry,
required this.state,
this.emptyState,
this.enableEmptyState = false,
this.topPadding = 0,
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 Center(child: EmptyConnection(onRetry: onRetry));
default:
return Container();
}
}
}