2021-09-08 14:38:26 +02:00
|
|
|
import 'package:flutter/material.dart';
|
2021-11-03 06:21:00 +01:00
|
|
|
import 'package:provider/single_child_widget.dart';
|
2021-09-08 14:38:26 +02:00
|
|
|
|
|
|
|
import '../l10n/l10n_from_string.dart';
|
|
|
|
import 'async_store.dart';
|
|
|
|
import 'observer_consumers.dart';
|
|
|
|
|
2021-11-03 06:21:00 +01:00
|
|
|
class AsyncStoreListener<T> extends SingleChildStatelessWidget {
|
2021-09-11 16:26:10 +02:00
|
|
|
final AsyncStore<T> asyncStore;
|
|
|
|
final String Function(
|
|
|
|
BuildContext context,
|
2021-10-02 18:48:00 +02:00
|
|
|
T data,
|
2021-09-11 16:26:10 +02:00
|
|
|
)? successMessageBuilder;
|
2021-09-08 14:38:26 +02:00
|
|
|
|
2022-01-15 16:15:55 +01:00
|
|
|
final void Function(
|
|
|
|
BuildContext context,
|
|
|
|
T data,
|
|
|
|
)? onSuccess;
|
|
|
|
|
2021-09-08 14:38:26 +02:00
|
|
|
const AsyncStoreListener({
|
2022-05-11 22:23:18 +02:00
|
|
|
super.key,
|
2021-09-08 14:38:26 +02:00
|
|
|
required this.asyncStore,
|
2021-09-11 16:26:10 +02:00
|
|
|
this.successMessageBuilder,
|
2022-01-15 16:15:55 +01:00
|
|
|
this.onSuccess,
|
2022-05-11 22:23:18 +02:00
|
|
|
super.child,
|
|
|
|
});
|
2021-09-08 14:38:26 +02:00
|
|
|
|
2021-12-04 18:03:54 +01:00
|
|
|
@override
|
2021-11-03 06:21:00 +01:00
|
|
|
Widget buildWithChild(BuildContext context, Widget? child) {
|
2021-09-11 16:26:10 +02:00
|
|
|
return ObserverListener<AsyncStore<T>>(
|
2021-09-08 14:38:26 +02:00
|
|
|
store: asyncStore,
|
|
|
|
listener: (context, store) {
|
2022-01-15 16:15:55 +01:00
|
|
|
store.map(
|
|
|
|
loading: () {},
|
|
|
|
error: (errorTerm) {
|
|
|
|
ScaffoldMessenger.of(context)
|
|
|
|
..hideCurrentSnackBar()
|
|
|
|
..showSnackBar(SnackBar(content: Text(errorTerm.tr(context))));
|
|
|
|
},
|
|
|
|
data: (data) {
|
|
|
|
onSuccess?.call(context, data);
|
2021-09-08 14:38:26 +02:00
|
|
|
|
2022-01-15 16:15:55 +01:00
|
|
|
if (successMessageBuilder != null) {
|
|
|
|
ScaffoldMessenger.of(context)
|
|
|
|
..hideCurrentSnackBar()
|
|
|
|
..showSnackBar(
|
|
|
|
SnackBar(
|
|
|
|
content: Text(successMessageBuilder!(context, data)),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
);
|
2021-09-08 14:38:26 +02:00
|
|
|
},
|
2021-11-03 06:21:00 +01:00
|
|
|
child: child ?? const SizedBox(),
|
2021-09-08 14:38:26 +02:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|