dialog_utils
Reusable Flutter dialogs with application-wide theme support and overridable styles and icons.
Features
- Error, success, confirmation, information, and waiting dialogs
DialogUtilsStyleintegration withThemeData.extensions- Configurable text styles, colors, icon sizes, button sizes, shape, and barrier opacity
- Subclass hooks for replacing styles and icon widgets
- A reusable
DialogUtils()factory instance
Available Dialogs
showErrorDlgshows an error with OK and optional cancel actions.showSuccessDlgshows a success message with OK and optional cancel actions.showConfirmDlgshows cancel and confirm actions and returns the choice.showInfoDlgshows an informational message with OK and optional cancel actions.showWaitingDlgdisplays progress while an asynchronousFutureResultruns.
Installation
Add the package to pubspec.yaml:
dependencies:
dialog_utils: ^0.0.2
Then run flutter pub get and import the public entrypoint:
import 'package:dialog_utils/dialog_utils.dart';
Example
The following example displays a confirmation dialog and handles the user's choice:
final confirmed = await DialogUtils().showConfirmDlg(
context,
title: 'Delete item?',
content: 'This action cannot be undone.',
confirmButtonText: 'Delete',
);
if (confirmed) {
// Delete the item.
}
Waiting dialog
showWaitingDlg displays a progress dialog while an asynchronous operation runs. The operation returns a FutureResult from the
result_utils package.
final result = await DialogUtils().showWaitingDlg<String>(
context: context,
message: 'Saving...',
future: () async {
await saveData();
return FutureResult.success('Saved');
},
);
if (result.hasError) {
print('Error: ${result.error}');
} else {
print('Data: ${result.value}');
}
See the complete runnable application in example/lib/main.dart. It demonstrates both direct factory usage and custom theme with icon overrides.
Screenshots
| Error | Success | Confirm | Info | Waiting |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Theming
DialogUtilsStyle is a Flutter ThemeExtension. Declare it alongside standard
Flutter theme configuration. The reusable DialogUtils() instance reads the
nearest style from the BuildContext when a dialog is shown. If the theme has
no DialogUtilsStyle extension, the constructor defaults on DialogUtilsStyle
are used.
MaterialApp(
theme: ThemeData(
extensions: const [
DialogUtilsStyle(
titleTextStyle: TextStyle(fontSize: 22),
contentTextStyle: TextStyle(fontSize: 17),
errorIconColor: Colors.deepOrange,
iconSize: 48,
dialogRadius: 16,
buttonMinimumSize: Size(120, 50),
),
],
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
minimumSize: Size(120, 50),
),
),
),
home: Builder(
builder: (context) => ElevatedButton(
onPressed: () => DialogUtils().showErrorDlg(
context,
title: 'Unable to save',
content: 'Please try again.',
),
child: const Text('Show dialog'),
),
),
);
Custom Icons And Styles
Subclass DialogUtils and override any style method, icon method, or dialog
method. Icon hooks return Widget, so they can return an Icon or a
completely custom widget. Use DialogUtils.withStyle for an independent
instance instead of the shared factory instance.
class AppDialogUtils extends DialogUtils {
const AppDialogUtils() : super.withStyle();
@override
Widget errorIcon(BuildContext context) {
return const Icon(Icons.warning_amber_rounded, size: 48);
}
@override
ButtonStyle primaryButtonStyle(BuildContext context) {
return ElevatedButton.styleFrom(
backgroundColor: Colors.teal,
foregroundColor: Colors.white,
);
}
}
Builder(
builder: (context) => ElevatedButton(
onPressed: () => const AppDialogUtils().showErrorDlg(
context,
title: 'Unable to save',
content: 'Please try again.',
),
child: const Text('Show dialog'),
),
);
The built-in override points are dialogTitleStyle, dialogContentStyle,
dialogButtonTextStyle, defaultButtonStyle, primaryButtonStyle,
errorIcon, successIcon, infoIcon, dialogBarrierColor, dialogShape,
showErrorDlg, showSuccessDlg, showConfirmDlg, showInfoDlg, and
showWaitingDlg.
License
See LICENSE.




