Handle replaceable snack bars in manager

This commit is contained in:
Ming Ming 2021-12-02 18:45:03 +08:00
parent 807b009dd7
commit 7ff21fa66e
2 changed files with 28 additions and 7 deletions

View file

@ -21,20 +21,38 @@ class SnackBarManager {
/// Show a snack bar if possible
///
/// If the snack bar can't be shown at this time, return null
/// If the snack bar can't be shown at this time, return null.
///
/// If [canBeReplaced] is true, this snackbar will be dismissed by the next
/// snack bar
ScaffoldFeatureController<SnackBar, SnackBarClosedReason>? showSnackBar(
SnackBar snackBar) {
SnackBar snackBar, {
bool canBeReplaced = false,
}) {
if (_canPrevBeReplaced) {
_prevController?.close();
}
_canPrevBeReplaced = canBeReplaced;
for (final h in _handlers.reversed) {
final result = h.showSnackBar(snackBar);
if (result != null) {
_prevController = result;
result.closed.whenComplete(() {
if (identical(_prevController, result)) {
_prevController = null;
}
});
return result;
}
}
_log.warning("[showSnackBar] No handler available");
_prevController = null;
return null;
}
final _handlers = <SnackBarHandler>[];
ScaffoldFeatureController<SnackBar, SnackBarClosedReason>? _prevController;
var _canPrevBeReplaced = false;
static final _inst = SnackBarManager._();

View file

@ -403,11 +403,14 @@ class _DynamicAlbumBrowserState extends State<DynamicAlbumBrowser>
}
void _onSelectionDeletePressed() async {
SnackBarManager().showSnackBar(SnackBar(
content: Text(L10n.global()
.deleteSelectedProcessingNotification(selectedListItems.length)),
duration: k.snackBarDurationShort,
));
SnackBarManager().showSnackBar(
SnackBar(
content: Text(L10n.global()
.deleteSelectedProcessingNotification(selectedListItems.length)),
duration: k.snackBarDurationShort,
),
canBeReplaced: true,
);
final selected = selectedListItems.whereType<_FileListItem>().toList();
setState(() {