|
|
|
@ -14,8 +14,20 @@ class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier> exte
|
|
|
|
final Function(T) onSelect;
|
|
|
|
final Function(T) onSelect;
|
|
|
|
final T initialValue;
|
|
|
|
final T initialValue;
|
|
|
|
final bool enabled;
|
|
|
|
final bool enabled;
|
|
|
|
|
|
|
|
final List<T> staticData;
|
|
|
|
final TranslationKeys title;
|
|
|
|
final TranslationKeys title;
|
|
|
|
const SingleItemDropDownMenu({Key key, @required this.context, @required this.title, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key);
|
|
|
|
|
|
|
|
|
|
|
|
/// If you want to use a static data (without calling API)
|
|
|
|
|
|
|
|
/// just use [NullableLoadingProvider] as generic data type and fill the [staticData]
|
|
|
|
|
|
|
|
const SingleItemDropDownMenu({
|
|
|
|
|
|
|
|
Key key,
|
|
|
|
|
|
|
|
@required this.context,
|
|
|
|
|
|
|
|
@required this.title,
|
|
|
|
|
|
|
|
this.onSelect,
|
|
|
|
|
|
|
|
this.initialValue,
|
|
|
|
|
|
|
|
this.enabled = true,
|
|
|
|
|
|
|
|
this.staticData,
|
|
|
|
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
State<SingleItemDropDownMenu<T, X>> createState() => _SingleItemDropDownMenuState<T, X>();
|
|
|
|
State<SingleItemDropDownMenu<T, X>> createState() => _SingleItemDropDownMenuState<T, X>();
|
|
|
|
@ -27,9 +39,11 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
void initState() {
|
|
|
|
void initState() {
|
|
|
|
provider = Provider.of<X>(widget.context);
|
|
|
|
if (widget.staticData != null) {
|
|
|
|
|
|
|
|
provider = Provider.of<X>(widget.context);
|
|
|
|
|
|
|
|
}
|
|
|
|
if (widget.initialValue != null) {
|
|
|
|
if (widget.initialValue != null) {
|
|
|
|
final result = provider.items?.where((element) {
|
|
|
|
final result = (widget.staticData ?? provider?.items)?.where((element) {
|
|
|
|
return element == widget.initialValue;
|
|
|
|
return element == widget.initialValue;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if (result.isNotEmpty) _selectedItem = result.first;
|
|
|
|
if (result.isNotEmpty) _selectedItem = result.first;
|
|
|
|
@ -49,7 +63,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
void didUpdateWidget(covariant SingleItemDropDownMenu<T, X> oldWidget) {
|
|
|
|
void didUpdateWidget(covariant SingleItemDropDownMenu<T, X> oldWidget) {
|
|
|
|
if (widget.initialValue != null) {
|
|
|
|
if (widget.initialValue != null) {
|
|
|
|
final result = provider.items?.where((element) {
|
|
|
|
final result = (widget.staticData ?? provider?.items)?.where((element) {
|
|
|
|
return element == widget.initialValue;
|
|
|
|
return element == widget.initialValue;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
if (result.isNotEmpty) {
|
|
|
|
if (result.isNotEmpty) {
|
|
|
|
@ -69,12 +83,12 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
return AppLoadingManager(
|
|
|
|
return AppLoadingManager(
|
|
|
|
isLoading: provider.loading,
|
|
|
|
isLoading: provider?.loading ?? false,
|
|
|
|
isFailedLoading: provider.items == null,
|
|
|
|
isFailedLoading: provider?.items == null && widget.staticData == null,
|
|
|
|
stateCode: provider.stateCode,
|
|
|
|
stateCode: widget.staticData == null ? provider?.stateCode : 200,
|
|
|
|
onRefresh: () async {
|
|
|
|
onRefresh: () async {
|
|
|
|
provider.reset();
|
|
|
|
provider?.reset();
|
|
|
|
await provider.getDate();
|
|
|
|
await provider?.getDate();
|
|
|
|
},
|
|
|
|
},
|
|
|
|
child: Container(
|
|
|
|
child: Container(
|
|
|
|
height: 60.toScreenHeight,
|
|
|
|
height: 60.toScreenHeight,
|
|
|
|
@ -87,7 +101,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
|
|
|
|
child: Stack(
|
|
|
|
child: Stack(
|
|
|
|
alignment: Alignment.center,
|
|
|
|
alignment: Alignment.center,
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
const PositionedDirectional(end: 0, child: Icon(Icons.keyboard_arrow_down_rounded)),
|
|
|
|
if (widget.enabled) const PositionedDirectional(end: 0, child: Icon(Icons.keyboard_arrow_down_rounded)),
|
|
|
|
Column(
|
|
|
|
Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
@ -117,7 +131,7 @@ class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier
|
|
|
|
});
|
|
|
|
});
|
|
|
|
widget.onSelect(newValue);
|
|
|
|
widget.onSelect(newValue);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
items: provider.items?.map<DropdownMenuItem<T>>((value) {
|
|
|
|
items: (widget.staticData ?? provider?.items)?.map<DropdownMenuItem<T>>((value) {
|
|
|
|
return DropdownMenuItem<T>(
|
|
|
|
return DropdownMenuItem<T>(
|
|
|
|
value: value,
|
|
|
|
value: value,
|
|
|
|
child: Text(
|
|
|
|
child: Text(
|
|
|
|
|