Files
modal_progress_hud_nsn/lib/modal_progress_hud_nsn.dart
2024-01-21 12:20:46 +05:30

80 lines
2.2 KiB
Dart

library modal_progress_hud_nsn;
import "package:flutter/material.dart";
import "dart:ui";
///
/// Wrap around any widget that makes an async call to show a modal progress
/// indicator while the async call is in progress.
///
/// HUD=Heads Up Display
///
class ModalProgressHUD extends StatelessWidget {
/// A required [bool]to toggle the loading animation.
final bool inAsyncCall;
/// A [double] value which states how opaque the loading overlay should be, defaults to 0.3
final double opacity;
/// A [Color] object which is assigned to the loading barrier, defaults to grey
final Color color;
/// A [Widget] which is shown at the center of the modal loading barrier,
/// defaults to the standard android spinny animation.
final Widget progressIndicator;
/// An [Offset] object which is applied to the [progressIndicator] when specified.
final Offset? offset;
/// A [bool] value which sets the `loading screen can be dismissible by tapping on the loading screen` rule.
final bool dismissible;
/// A [Widget] which should be the the widget to be shown behind the loading barrier.
final Widget child;
/// A [double] value specifying the amount of background blur when progress hud is active.
final double blur;
const ModalProgressHUD({
Key? key,
required this.inAsyncCall,
this.opacity = 0.3,
this.color = Colors.grey,
this.progressIndicator = const CircularProgressIndicator(),
this.offset,
this.dismissible = false,
required this.child,
this.blur = 0.0,
}) : super(key: key);
@override
Widget build(BuildContext context) {
Widget layOutProgressIndicator;
if (offset == null) {
layOutProgressIndicator = Center(child: progressIndicator);
} else {
layOutProgressIndicator = Positioned(
left: offset!.dx,
top: offset!.dy,
child: progressIndicator,
);
}
return Stack(
children: [
child,
if (inAsyncCall) ...[
BackdropFilter(
filter: ImageFilter.blur(sigmaX: blur, sigmaY: blur),
child: Opacity(
opacity: opacity,
child: ModalBarrier(dismissible: dismissible, color: color),
),
),
layOutProgressIndicator,
],
],
);
}
}