1- change text form field code

2- app bar design
3- working on request gas refill screen
main_design2.0
zaid_daoud 2 years ago
parent 5ded8e4386
commit 3bdae42769

@ -20,5 +20,10 @@
"newServiceRequest" : "طلب خدمة جديدة", "newServiceRequest" : "طلب خدمة جديدة",
"newGasRefillRequest" : "طلب إعادة تعبئة غاز جديد", "newGasRefillRequest" : "طلب إعادة تعبئة غاز جديد",
"newTransferRequest" : "طلب نقل جديد", "newTransferRequest" : "طلب نقل جديد",
"submitRequest" : "تأكيد الطلب" "submitRequest" : "تأكيد الطلب",
"select" : "إختر",
"gasType" : "نوع الغاز",
"quantity" : "الكمية",
"cylinderType" : "نوع الأسطوانة",
"cylinderSize" : "حجم الأسطوانة"
} }

@ -20,5 +20,10 @@
"newServiceRequest" : "New Service Request", "newServiceRequest" : "New Service Request",
"newGasRefillRequest" : "New Gas Refill Request", "newGasRefillRequest" : "New Gas Refill Request",
"newTransferRequest" : "New Transfer Request", "newTransferRequest" : "New Transfer Request",
"submitRequest" : "Submit Request" "submitRequest" : "Submit Request",
"select" : "Select",
"gasType": "Gas Type",
"quantity" : "Quantity",
"cylinderType" : "Cylinder Type",
"cylinderSize" : "Cylinder Size"
} }

@ -12,6 +12,9 @@ import 'package:test_sa/new_views/pages/login_page.dart';
import 'package:test_sa/new_views/pages/new_service_request_page.dart'; import 'package:test_sa/new_views/pages/new_service_request_page.dart';
import 'package:test_sa/new_views/pages/new_transfer_request_page.dart'; import 'package:test_sa/new_views/pages/new_transfer_request_page.dart';
import 'package:test_sa/new_views/pages/splash_page.dart'; import 'package:test_sa/new_views/pages/splash_page.dart';
import 'package:test_sa/providers/gas_request_providers/cylinder_size_provider.dart';
import 'package:test_sa/providers/gas_request_providers/cylinder_type_provider.dart';
import 'package:test_sa/providers/gas_request_providers/gas_types_provider.dart';
import 'controllers/providers/api/user_provider.dart'; import 'controllers/providers/api/user_provider.dart';
import 'controllers/providers/settings/setting_provider.dart'; import 'controllers/providers/settings/setting_provider.dart';
@ -52,6 +55,9 @@ class MyApp extends StatelessWidget {
return MultiProvider( return MultiProvider(
providers: [ providers: [
ChangeNotifierProvider(create: (_) => UserProvider()), ChangeNotifierProvider(create: (_) => UserProvider()),
ChangeNotifierProvider(create: (_) => GasTypesProvider()),
ChangeNotifierProvider(create: (_) => CylinderTypesProvider()),
ChangeNotifierProvider(create: (_) => CylinderSizeProvider()),
], ],
child: GestureDetector( child: GestureDetector(
onTap: () { onTap: () {

@ -0,0 +1,5 @@
class Base {
final String name, identifier;
const Base({this.name, this.identifier});
}

@ -21,4 +21,9 @@ enum TranslationKeys {
newGasRefillRequest, newGasRefillRequest,
newTransferRequest, newTransferRequest,
submitRequest, submitRequest,
select,
gasType,
quantity,
cylinderType,
cylinderSize,
} }

@ -1,15 +1,9 @@
class Lookup { import 'base.dart';
//old name label
final String name;
// old name key
final int value;
final int id;
const Lookup({ class Lookup extends Base {
this.name, final int id, value;
this.value,
this.id, Lookup({this.id, this.value, String name}) : super(identifier: id?.toString(), name: name);
});
@override @override
bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id)); bool operator ==(Object other) => identical(this, other) || other is Lookup && ((value != null && value == other.value) || (id != null && id == other.id));
@ -38,21 +32,4 @@ class Lookup {
value: parsedJson["value"], value: parsedJson["value"],
); );
} }
// factory Lookup.fromJson(Map<String,dynamic> parsedJson){
// if(parsedJson["id"] == null && parsedJson["uid"] == null) return null;
// return Lookup(
// name: parsedJson["value"],
// id: parsedJson["id"] is int
// ? parsedJson["id"]
// : int.tryParse(parsedJson["id"] ?? parsedJson["uid"]),
// );
// }
// factory Lookup.fromIntIdJson(Map<String,dynamic> parsedJson){
// return Lookup(
// name: parsedJson["value"],
// id: parsedJson["id"],
// );
// }
} }

@ -35,8 +35,13 @@ class _AppFloatingActionButtonState extends State<AppFloatingActionButton> {
return Column( return Column(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: [ children: [
AnimatedOpacity( Visibility(
visible: turns != 0,
maintainAnimation: true,
maintainState: true,
child: AnimatedOpacity(
opacity: turns != 0 ? 1 : 0, opacity: turns != 0 ? 1 : 0,
duration: duration, duration: duration,
child: Card( child: Card(
@ -57,6 +62,7 @@ class _AppFloatingActionButtonState extends State<AppFloatingActionButton> {
), ),
), ),
), ),
),
16.height, 16.height,
FloatingActionButton( FloatingActionButton(
child: AnimatedRotation( child: AnimatedRotation(

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/new_views/app_style/app_color.dart';
import 'package:test_sa/views/app_style/sizing.dart'; import 'package:test_sa/views/app_style/sizing.dart';
import '../../views/widgets/loaders/app_loading.dart';
class AppLazyLoading extends StatelessWidget { class AppLazyLoading extends StatelessWidget {
const AppLazyLoading({Key key}) : super(key: key); const AppLazyLoading({Key key}) : super(key: key);
@ -10,11 +10,11 @@ class AppLazyLoading extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Center( return Center(
child: Container( child: Container(
height: 36 * AppStyle.getScaleFactor(context), height: 36.toScreenWidth,
width: 36 * AppStyle.getScaleFactor(context), width: 36.toScreenWidth,
padding: const EdgeInsets.all(8), padding: const EdgeInsets.all(8),
decoration: const BoxDecoration(color: Colors.white, shape: BoxShape.circle, boxShadow: [AppStyle.boxShadow]), decoration: const BoxDecoration(color: AppColor.neutral10, shape: BoxShape.circle, boxShadow: [AppStyle.boxShadow]),
child: const ALoading(), child: const Center(child: CircularProgressIndicator(strokeWidth: 3)),
), ),
); );
} }

@ -0,0 +1,94 @@
import 'package:flutter/material.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/new_views/common_widgets/app_lazy_loading.dart';
import '../app_style/app_color.dart';
class AppLoadingManager extends StatefulWidget {
final bool isLoading;
final bool isFailedLoading;
final bool isNotPage;
final int progress;
final bool askOnBack;
final int stateCode;
final Future<void> Function() onRefresh;
final Widget child;
const AppLoadingManager({
Key key,
@required this.isLoading,
@required this.isFailedLoading,
@required this.stateCode,
@required this.onRefresh,
@required this.child,
this.progress,
this.isNotPage = false,
this.askOnBack = false,
}) : super(key: key);
@override
State<AppLoadingManager> createState() => _AppLoadingManagerState();
}
class _AppLoadingManagerState extends State<AppLoadingManager> {
@override
void initState() {
if (widget.onRefresh != null && widget.stateCode == null) {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
widget.onRefresh();
});
}
super.initState();
}
@override
Widget build(BuildContext context) {
Widget placeHolder;
// to load data if load not start
if (widget.isLoading != true && widget.stateCode == null) {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
widget.onRefresh();
});
}
// if loading of still not start in loading (true or null)
// return loading widget
if (widget.isLoading != false || widget.stateCode == null) {
placeHolder = Container(
height: 60.toScreenHeight,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: context.isDark ? AppColor.neutral50 : Colors.white,
),
child: const AppLazyLoading(),
);
} else if (widget.isFailedLoading && !widget.isNotPage) {
// if failed return failed widget
placeHolder = Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("Error Request Failed", style: Theme.of(context).textTheme.titleMedium),
16.height,
OutlinedButton(
onPressed: widget.onRefresh,
child: const Text("try again"),
)
],
),
);
}
// if load end successfully return loaded widget
return RefreshIndicator(
onRefresh: () async {
await widget.onRefresh();
},
child: AnimatedSwitcher(
duration: const Duration(milliseconds: 400),
child: placeHolder ?? widget.child,
),
);
}
}

@ -62,20 +62,8 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( final border = UnderlineInputBorder(borderSide: BorderSide.none, borderRadius: BorderRadius.circular(10));
alignment: Alignment.topCenter, return TextFormField(
children: [
Container(
height: widget.textInputType == TextInputType.multiline ? null : 56.toScreenHeight,
decoration: BoxDecoration(
color: context.isDark ? AppColor.neutral50 : Colors.white,
borderRadius: BorderRadius.circular(10),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
child: TextFormField(
focusNode: widget.node, focusNode: widget.node,
enabled: widget.enable, enabled: widget.enable,
onSaved: widget.onSaved, onSaved: widget.onSaved,
@ -91,14 +79,17 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
onEditingComplete: widget.onAction ?? () => FocusScope.of(context).nextFocus(), onEditingComplete: widget.onAction ?? () => FocusScope.of(context).nextFocus(),
style: Theme.of(context).textTheme.bodyLarge, style: Theme.of(context).textTheme.bodyLarge,
decoration: InputDecoration( decoration: InputDecoration(
border: InputBorder.none, border: border,
suffixIconConstraints: const BoxConstraints(minWidth: 0), disabledBorder: border,
disabledBorder: InputBorder.none, focusedBorder: border,
focusedBorder: InputBorder.none, enabledBorder: border,
enabledBorder: InputBorder.none, errorBorder: border,
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.symmetric(vertical: 8.toScreenHeight, horizontal: 16.toScreenWidth),
constraints: const BoxConstraints(), constraints: const BoxConstraints(),
errorStyle: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60, height: 0.7), suffixIconConstraints: const BoxConstraints(minWidth: 0),
filled: true,
fillColor: context.isDark ? AppColor.neutral50 : Colors.white,
errorStyle: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? AppColor.red50 : AppColor.red60),
floatingLabelStyle: Theme.of(context).textTheme.labelLarge?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500), floatingLabelStyle: Theme.of(context).textTheme.labelLarge?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500),
hintText: widget.hintText != null ? context.translate(widget.hintText) : null, hintText: widget.hintText != null ? context.translate(widget.hintText) : null,
labelText: widget.labelText != null ? context.translate(widget.labelText) : null, labelText: widget.labelText != null ? context.translate(widget.labelText) : null,
@ -107,12 +98,9 @@ class _AppTextFormFieldState extends State<AppTextFormField> {
: Icon( : Icon(
widget.prefixIconData, widget.prefixIconData,
size: widget.prefixIconSize == null ? 20 * AppStyle.getScaleFactor(context) : (widget.prefixIconSize - 10) * AppStyle.getScaleFactor(context), size: widget.prefixIconSize == null ? 20 * AppStyle.getScaleFactor(context) : (widget.prefixIconSize - 10) * AppStyle.getScaleFactor(context),
color: const Color(0xff2e303a), color: AppColor.neutral70,
),
),
), ),
), ),
],
); );
} }
} }

@ -0,0 +1,139 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:test_sa/extensions/context_extension.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/enums/translation_keys.dart';
import 'package:test_sa/new_views/common_widgets/app_loading_manager.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import '../../models/base.dart';
import '../app_style/app_color.dart';
class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier> extends StatefulWidget {
final BuildContext context;
final Function(T) onSelect;
final T initialValue;
final bool enabled;
final TranslationKeys title;
const SingleItemDropDownMenu({Key key, @required this.context, @required this.title, this.onSelect, this.initialValue, this.enabled = true}) : super(key: key);
@override
State<SingleItemDropDownMenu<T, X>> createState() => _SingleItemDropDownMenuState<T, X>();
}
class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier> extends State<SingleItemDropDownMenu<T, X>> {
T _selectedItem;
X provider;
@override
void initState() {
provider = Provider.of<X>(widget.context);
if (widget.initialValue != null) {
final result = provider.items?.where((element) {
return element == widget.initialValue;
});
if (result.isNotEmpty) _selectedItem = result.first;
if (widget.initialValue?.identifier ?? "" != _selectedItem?.identifier ?? "") {
widget.onSelect(_selectedItem);
}
}
super.initState();
}
@override
void setState(VoidCallback fn) {
if (mounted) super.setState(fn);
}
@override
void didUpdateWidget(covariant SingleItemDropDownMenu<T, X> oldWidget) {
if (widget.initialValue != null) {
final result = provider.items?.where((element) {
return element == widget.initialValue;
});
if (result.isNotEmpty) {
_selectedItem = result.first;
} else {
_selectedItem = null;
}
if (widget.initialValue?.identifier ?? "" != _selectedItem?.identifier ?? "") {
widget.onSelect(_selectedItem);
}
} else {
_selectedItem = null;
}
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return AppLoadingManager(
isLoading: provider.loading,
isFailedLoading: provider.items == null,
stateCode: provider.stateCode,
onRefresh: () async {
provider.reset();
await provider.getDate();
},
child: Container(
height: 60.toScreenHeight,
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
decoration: BoxDecoration(
color: context.isDark ? AppColor.neutral50 : Colors.white,
borderRadius: BorderRadius.circular(10),
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
),
child: Stack(
alignment: Alignment.center,
children: [
const PositionedDirectional(end: 0, child: Icon(Icons.keyboard_arrow_down_rounded)),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
context.translate(widget.title),
style: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500),
),
DropdownButton<T>(
value: _selectedItem,
iconSize: 24,
isDense: true,
icon: const SizedBox.shrink(),
elevation: 0,
isExpanded: true,
hint: Text(
context.translate(TranslationKeys.select),
style: Theme.of(context).textTheme.bodyLarge,
),
style: TextStyle(color: Theme.of(context).primaryColor),
underline: const SizedBox.shrink(),
onChanged: widget.enabled == false
? null
: (T newValue) {
setState(() {
_selectedItem = newValue;
});
widget.onSelect(newValue);
},
items: provider.items?.map<DropdownMenuItem<T>>((value) {
return DropdownMenuItem<T>(
value: value,
child: Text(
value?.name ?? "",
style: Theme.of(context).textTheme.bodyLarge,
),
);
})?.toList(),
),
],
),
),
],
),
),
);
}
}

@ -1,6 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:test_sa/extensions/int_extensions.dart';
import 'package:test_sa/models/enums/translation_keys.dart'; import 'package:test_sa/models/enums/translation_keys.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart';
import 'package:test_sa/new_views/common_widgets/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/single_item_drop_down_menu.dart';
import 'package:test_sa/providers/gas_request_providers/cylinder_size_provider.dart';
import 'package:test_sa/providers/gas_request_providers/cylinder_type_provider.dart';
import 'package:test_sa/providers/gas_request_providers/gas_types_provider.dart';
import '../common_widgets/default_app_bar.dart'; import '../common_widgets/default_app_bar.dart';
@ -12,6 +19,36 @@ class NewGasRefillRequestPage extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: const DefaultAppBar(title: TranslationKeys.newGasRefillRequest), appBar: const DefaultAppBar(title: TranslationKeys.newGasRefillRequest),
body: Padding(
padding: EdgeInsets.symmetric(horizontal: 16.toScreenWidth),
child: SingleChildScrollView(
child: Column(
children: [
16.height,
SingleItemDropDownMenu<Lookup, GasTypesProvider>(
context: context,
title: TranslationKeys.gasType,
),
8.height,
const AppTextFormField(
labelText: TranslationKeys.quantity,
textInputType: TextInputType.number,
),
8.height,
SingleItemDropDownMenu<Lookup, CylinderTypesProvider>(
context: context,
title: TranslationKeys.cylinderType,
),
8.height,
SingleItemDropDownMenu<Lookup, CylinderSizeProvider>(
context: context,
title: TranslationKeys.cylinderSize,
),
8.height,
],
),
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: AppFilledButton( floatingActionButton: AppFilledButton(
label: TranslationKeys.submitRequest, label: TranslationKeys.submitRequest,

@ -0,0 +1,34 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../controllers/api_routes/api_manager.dart';
import '../../controllers/api_routes/urls.dart';
import '../../models/lookup.dart';
import '../loading_list_notifier.dart';
class CylinderSizeProvider extends LoadingListNotifier<Lookup> {
@override
Future getDate() async {
if (loading ?? false) return -2;
loading = true;
notifyListeners();
try {
Response response = await ApiManager.instance.get(URLs.getGasTypes);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
loading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
loading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -0,0 +1,34 @@
import 'dart:convert';
import 'package:http/http.dart';
import '../../controllers/api_routes/api_manager.dart';
import '../../controllers/api_routes/urls.dart';
import '../../models/lookup.dart';
import '../loading_list_notifier.dart';
class CylinderTypesProvider extends LoadingListNotifier<Lookup> {
@override
Future getDate() async {
if (loading ?? false) return -2;
loading = true;
notifyListeners();
try {
Response response = await ApiManager.instance.get(URLs.getGasTypes);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
loading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
loading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -0,0 +1,34 @@
import 'dart:convert';
import 'package:http/http.dart';
import 'package:test_sa/models/lookup.dart';
import 'package:test_sa/providers/loading_list_notifier.dart';
import '../../controllers/api_routes/api_manager.dart';
import '../../controllers/api_routes/urls.dart';
class GasTypesProvider extends LoadingListNotifier<Lookup> {
@override
Future getDate() async {
if (loading ?? false) return -2;
loading = true;
notifyListeners();
try {
Response response = await ApiManager.instance.get(URLs.getGasTypes);
stateCode = response.statusCode;
if (response.statusCode >= 200 && response.statusCode < 300) {
// client's request was successfully received
List categoriesListJson = json.decode(response.body)["data"];
items = categoriesListJson.map((item) => Lookup.fromJson(item)).toList();
}
loading = false;
notifyListeners();
return response.statusCode;
} catch (error) {
loading = false;
stateCode = -1;
notifyListeners();
return -1;
}
}
}

@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
import 'package:test_sa/models/base.dart';
abstract class LoadingListNotifier<T extends Base> extends ChangeNotifier {
int stateCode;
List<T> items = [];
bool _loading = false;
bool get loading => _loading;
set loading(bool value) {
_loading = value;
notifyListeners();
}
void reset() {
items = null;
_loading = null;
stateCode = null;
}
Future getDate();
}

@ -45,7 +45,7 @@ class CreateSubWorkOrderPage extends StatefulWidget {
class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> { class _CreateSubWorkOrderPageState extends State<CreateSubWorkOrderPage> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>(); final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
SearchWorkOrder _subWorkOrders; SearchWorkOrder _subWorkOrders;
Lookup _serviceReportReason = const Lookup(); Lookup _serviceReportReason = Lookup();
ServiceReport _serviceReport; ServiceReport _serviceReport;
final List<File> _files = []; final List<File> _files = [];
bool _isLoading = false; bool _isLoading = false;

@ -162,7 +162,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
if (_firstTime) { if (_firstTime) {
String _clientName; String _clientName;
if (widget.gasRefillModel != null) { if (widget.gasRefillModel != null) {
_formModel.status = widget.gasRefillModel?.status ?? const Lookup(value: 0); _formModel.status = widget.gasRefillModel?.status ?? Lookup(value: 0);
_gasRefillProvider.expectedDateTime = _formModel.expectedDate; _gasRefillProvider.expectedDateTime = _formModel.expectedDate;
_gasRefillProvider.timer = TimerModel(startAt: widget.gasRefillModel?.startDate, endAt: widget.gasRefillModel?.endDate); _gasRefillProvider.timer = TimerModel(startAt: widget.gasRefillModel?.startDate, endAt: widget.gasRefillModel?.endDate);
_clientName = _formModel.clientName; _clientName = _formModel.clientName;
@ -229,7 +229,7 @@ class _RequestGasRefillState extends State<RequestGasRefill> {
height: 4, height: 4,
), ),
GasStatusMenu( GasStatusMenu(
initialValue: _formModel.status ?? const Lookup(value: 0), initialValue: _formModel.status ?? Lookup(value: 0),
enabled: widget.gasRefillModel != null, enabled: widget.gasRefillModel != null,
onSelect: (status) { onSelect: (status) {
_formModel.status = status; _formModel.status = status;

Loading…
Cancel
Save