2021-09-08 14:38:26 +02:00
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
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
|
|
|
|
|
|
|
const AsyncStoreListener({
|
|
|
|
Key? key,
|
|
|
|
required this.asyncStore,
|
2021-09-11 16:26:10 +02:00
|
|
|
this.successMessageBuilder,
|
2021-11-03 06:21:00 +01:00
|
|
|
Widget? child,
|
|
|
|
}) : super(key: key, child: 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) {
|
|
|
|
final errorTerm = store.errorTerm;
|
|
|
|
|
|
|
|
if (errorTerm != null) {
|
|
|
|
ScaffoldMessenger.of(context)
|
|
|
|
..hideCurrentSnackBar()
|
|
|
|
..showSnackBar(SnackBar(content: Text(errorTerm.tr(context))));
|
|
|
|
} else if (store.asyncState is AsyncStateData &&
|
2021-10-02 18:48:00 +02:00
|
|
|
(successMessageBuilder != null)) {
|
2021-09-08 14:38:26 +02:00
|
|
|
ScaffoldMessenger.of(context)
|
|
|
|
..hideCurrentSnackBar()
|
2021-09-11 16:26:10 +02:00
|
|
|
..showSnackBar(SnackBar(
|
2021-10-02 18:48:00 +02:00
|
|
|
content: Text(successMessageBuilder!(
|
|
|
|
context, (store.asyncState as AsyncStateData).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
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|