small changes based on the services

mirza_dev
Mirza.Shafique@cloudsolutions.com.sa 2 years ago
parent e67701d132
commit 9c190bd730

@ -31,6 +31,7 @@ import 'package:mc_common_app/models/appointments_models/appointment_list_model.
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/views/advertisement/ads_detail_view.dart'; import 'package:mc_common_app/views/advertisement/ads_detail_view.dart';
import 'package:mc_common_app/views/advertisement/create_ad_view.dart'; import 'package:mc_common_app/views/advertisement/create_ad_view.dart';
import 'package:mc_common_app/views/advertisement/select_ad_type_view.dart';
import 'package:mc_common_app/views/chat/chat_view.dart'; import 'package:mc_common_app/views/chat/chat_view.dart';
import '../views/dashboard/dashboard_page.dart'; import '../views/dashboard/dashboard_page.dart';
@ -73,7 +74,9 @@ class ProviderAppRoutes {
static final Map<String, WidgetBuilder> routes = { static final Map<String, WidgetBuilder> routes = {
//Home page //Home page
AppRoutes.dashboard: (context) => const DashboardPage(), AppRoutes.dashboard: (context) => const DashboardPage(),
AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel), AppRoutes.adsDetailView: (context) => AdsDetailView(
adDetails:
ModalRoute.of(context)!.settings.arguments as AdDetailsModel),
AppRoutes.createAdView: (context) => const CreateAdView(), AppRoutes.createAdView: (context) => const CreateAdView(),
//setting //setting
@ -100,7 +103,8 @@ class ProviderAppRoutes {
//Requests //Requests
AppRoutes.requestsDetailPage: (context) => RequestDetailPage( AppRoutes.requestsDetailPage: (context) => RequestDetailPage(
requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments as RequestDetailPageArguments, requestDetailPageArguments: ModalRoute.of(context)!.settings.arguments
as RequestDetailPageArguments,
), ),
AppRoutes.sendOfferPage: (context) => const SendOfferPage(), AppRoutes.sendOfferPage: (context) => const SendOfferPage(),
@ -130,10 +134,19 @@ class ProviderAppRoutes {
addSchedule: (context) => AddSchedulesPage(), addSchedule: (context) => AddSchedulesPage(),
//Branch Duplication //Branch Duplication
matchServices: (context) => MatchedServicesPage((ModalRoute.of(context)!.settings.arguments) == null ? null : (ModalRoute.of(context)!.settings.arguments as MatchServicesArguments)), matchServices: (context) => MatchedServicesPage(
(ModalRoute.of(context)!.settings.arguments) == null
? null
: (ModalRoute.of(context)!.settings.arguments
as MatchServicesArguments)),
AppRoutes.chatView: (context) => ChatView( AppRoutes.chatView: (context) => ChatView(
chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments, chatViewArguments:
ModalRoute.of(context)!.settings.arguments as ChatViewArguments,
), ),
//ADS:
AppRoutes.selectAdTypeView: (context) => SelectAdTypeView(
isProvider: ModalRoute.of(context)!.settings.arguments as bool),
}; };
} }

@ -382,9 +382,10 @@ class ServiceVM extends BaseVM {
Future<void> getAllCities( Future<void> getAllCities(
BranchDetailModel? branchData, String countryCode) async { BranchDetailModel? branchData, String countryCode) async {
setState(ViewState.busy); setState(ViewState.busy);
citiesDropList.clear(); citiesDropList=[];
cities = null; cities = null;
cityId = -1; cityId = -1;
cityValue=null;
cities = await commonRepo.getAllCites(countryId.toString()); cities = await commonRepo.getAllCites(countryId.toString());
cities!.data?.forEach((element) { cities!.data?.forEach((element) {
if (branchData != null && branchData.id != null) { if (branchData != null && branchData.id != null) {

@ -80,7 +80,7 @@ class UpdateAppointmentPage extends StatelessWidget {
Column( Column(
children: [ children: [
showPayNowButton(context, appointmentsVM), showPayNowButton(context, appointmentsVM),
21.height, 12.height,
showCancelButton(context, appointmentsVM), showCancelButton(context, appointmentsVM),
], ],
).paddingAll(21), ).paddingAll(21),
@ -102,7 +102,7 @@ class UpdateAppointmentPage extends StatelessWidget {
Column( Column(
children: [ children: [
showPayNowButton(context, appointmentsVM), showPayNowButton(context, appointmentsVM),
21.height, 12.height,
showPayLaterButton(context, appointmentsVM), showPayLaterButton(context, appointmentsVM),
], ],
).paddingAll(21), ).paddingAll(21),
@ -113,7 +113,9 @@ class UpdateAppointmentPage extends StatelessWidget {
AppointmentStatusEnum.workStarted) && AppointmentStatusEnum.workStarted) &&
appointmentListModel.appointmentPaymentStatusEnum == appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.payNow) AppointmentPaymentStatusEnum.payNow)
"Waiting for the payment from the customer".toText(), "Waiting for the payment from the customer"
.toText()
.paddingAll(21),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum ==
AppointmentStatusEnum.arrived && AppointmentStatusEnum.arrived &&
@ -134,7 +136,7 @@ class UpdateAppointmentPage extends StatelessWidget {
Column( Column(
children: [ children: [
showPayLaterButton(context, appointmentsVM), showPayLaterButton(context, appointmentsVM),
21.height, 12.height,
showPayNowButton(context, appointmentsVM), showPayNowButton(context, appointmentsVM),
], ],
).paddingAll(21), ).paddingAll(21),
@ -154,7 +156,7 @@ class UpdateAppointmentPage extends StatelessWidget {
AppointmentStatusEnum.workStarted && AppointmentStatusEnum.workStarted &&
appointmentListModel.appointmentPaymentStatusEnum == appointmentListModel.appointmentPaymentStatusEnum ==
AppointmentPaymentStatusEnum.payLater) AppointmentPaymentStatusEnum.payLater)
showPayNowButton(context, appointmentsVM), showPayNowButton(context, appointmentsVM).paddingAll(21),
if (appointmentListModel.appointmentStatusEnum == if (appointmentListModel.appointmentStatusEnum ==
AppointmentStatusEnum.visitCompleted) AppointmentStatusEnum.visitCompleted)
@ -234,6 +236,7 @@ class UpdateAppointmentPage extends StatelessWidget {
"appointmentID": appointmentListModel.id.toString(), "appointmentID": appointmentListModel.id.toString(),
"appointmentServicePaymentStatusID": 2 "appointmentServicePaymentStatusID": 2
}); });
_updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context); Utils.hideLoading(context);
}, },
); );
@ -249,6 +252,7 @@ class UpdateAppointmentPage extends StatelessWidget {
"appointmentID": appointmentListModel.id.toString(), "appointmentID": appointmentListModel.id.toString(),
"appointmentStatusID": 3 "appointmentStatusID": 3
}); });
_updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context); Utils.hideLoading(context);
}, },
); );
@ -265,6 +269,7 @@ class UpdateAppointmentPage extends StatelessWidget {
"appointmentID": appointmentListModel.id.toString(), "appointmentID": appointmentListModel.id.toString(),
"appointmentServicePaymentStatusID": 4 "appointmentServicePaymentStatusID": 4
}); });
_updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context); Utils.hideLoading(context);
}, },
); );
@ -281,6 +286,7 @@ class UpdateAppointmentPage extends StatelessWidget {
"appointmentID": appointmentListModel.id.toString(), "appointmentID": appointmentListModel.id.toString(),
"appointmentStatusID": 8 "appointmentStatusID": 8
}); });
_updateAppointment(context, appointmentListModel.branchId ?? 0);
Utils.hideLoading(context); Utils.hideLoading(context);
}, },
); );

@ -43,10 +43,8 @@ class _DashboardPageState extends State<DashboardPage> {
void initState() { void initState() {
super.initState(); super.initState();
dashboardVM = Provider.of<DashboardVM>(context, listen: false); dashboardVM = Provider.of<DashboardVM>(context, listen: false);
scheduleMicrotask(() {
context.read<RequestsVM>().populateRequestsFilterList(); context.read<RequestsVM>().populateRequestsFilterList();
_onRefresh(); _onRefresh();
});
} }
Future<void> _onRefresh() async { Future<void> _onRefresh() async {
@ -70,18 +68,26 @@ class _DashboardPageState extends State<DashboardPage> {
"0" "0"
}); });
} }
adVm.populateAdsFilterList();
if (adVm.myAds.isEmpty) { if (adVm.myAds.isEmpty) {
await adVm.getMyAds(); await adVm.getMyAds();
} }
if (adVm.exploreAds.isEmpty) { if (adVm.exploreAds.isEmpty) {
await adVm.getExploreAds(); await adVm.getExploreAds();
} if (adVm.vehicleTypes.isEmpty) {
await adVm.getVehicleTypes();
}
if (adVm.vehicleAdsDurations.isEmpty) {
await adVm.getVehicleAdsDuration();
} }
if (requestsVM.myRequests.isEmpty) { if (requestsVM.myRequests.isEmpty) {
await requestsVM.getRequests(appType: AppType.provider); await requestsVM.getRequests(appType: AppType.provider);
} }
await chatVM.buildHubConnection(context); // await chatVM.buildHubConnection(context);
} }

@ -1,19 +1,20 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/views/advertisement/ads_list.dart'; import 'package:mc_common_app/views/advertisement/ads_list.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; import 'package:mc_common_app/widgets/common_widgets/categories_list.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:easy_localization/easy_localization.dart';
class AdsFragment extends StatelessWidget { class AdsFragment extends StatelessWidget {
bool isNeedAppBar; bool isNeedAppBar;
@ -27,13 +28,23 @@ class AdsFragment extends StatelessWidget {
await adVM.getMyAds(); await adVM.getMyAds();
} }
List<AdDetailsModel> getAdsList(AdVM adVM) {
if (adVM.isExploreAdsTapped) {
return adVM.exploreAdsFilteredList;
}
if (adVM.myAdsFilteredList.isNotEmpty) {
return adVM.myAdsFilteredList;
}
return [];
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: !isNeedAppBar appBar: !isNeedAppBar
? null ? null
: CustomAppBar( : CustomAppBar(
title: LocaleKeys.myServiceBranches.tr(), title: "Ads",
onBackButtonTapped: onBackButtonTapped, onBackButtonTapped: onBackButtonTapped,
), ),
body: Container( body: Container(
@ -43,70 +54,65 @@ class AdsFragment extends StatelessWidget {
child: Column( child: Column(
children: [ children: [
16.height, 16.height,
// Consumer( Consumer(
// builder: (BuildContext context, AdVM adVM, Widget? child) { builder: (BuildContext context, AdVM adVM, Widget? child) {
// return Column( return Column(
// children: [ children: [
// Row( Row(
// children: [ children: [
// Expanded( Expanded(
// child: ShowFillButton( child: ShowFillButton(
// isFilled: adVM.isExploreAdsTapped, isFilled: adVM.isExploreAdsTapped,
// maxHeight: 55, maxHeight: 55,
// title: "Explore Ads", title: "Explore Ads",
// txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
// onPressed: () { onPressed: () {
// print("ads: ${AppState().getUser.data!.accessToken}"); print("ads: ${AppState().getUser.data!.accessToken}");
// adVM.updateIsExploreAds(true); adVM.updateIsExploreAds(true);
// }, },
// ), ),
// ), ),
// 12.width, 12.width,
// Expanded( Expanded(
// child: ShowFillButton( child: ShowFillButton(
// isFilled: !adVM.isExploreAdsTapped, isFilled: !adVM.isExploreAdsTapped,
// txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor,
// maxHeight: 55, maxHeight: 55,
// title: "My Ads", title: "My Ads",
// onPressed: () { onPressed: () {
// adVM.updateIsExploreAds(false); adVM.updateIsExploreAds(false);
// }, },
// ), ),
// ), ),
// ], ],
// ).horPaddingMain(), ).horPaddingMain(),
// if (adVM.isExploreAdsTapped && adVM.exploreAds.isNotEmpty) ...[ if (adVM.isExploreAdsTapped) ...[
// 16.height, 16.height,
// FiltersList(filterList: adVM.exploreAdsFilterOptions, onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(index: index), needLeftPadding: false) FiltersList(
// .paddingOnly(left: 21), filterList: adVM.exploreAdsFilterOptions,
// ], onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(createdByRoleFilter: selectedFilterId.toCreatedByRoleEnum()),
// if (!adVM.isExploreAdsTapped && adVM.myAds.isNotEmpty) ...[ needLeftPadding: false)
// 16.height, .paddingOnly(left: 21),
// FiltersList( ],
// filterList: adVM.myAdsFilterOptions, if (!adVM.isExploreAdsTapped) ...[
// onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(index: index, selectedFilterId: selectedFilterId), 16.height,
// needLeftPadding: false) FiltersList(
// .paddingOnly(left: 21), filterList: adVM.myAdsFilterOptions,
// ], onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(adPostStatusEnum: selectedFilterId.toAdPostEnum()),
// ], needLeftPadding: false,
// ); ).paddingOnly(left: 21),
// }, ],
// ), ],
);
},
),
16.height, 16.height,
Expanded( Expanded(
child: RefreshIndicator( child: RefreshIndicator(
onRefresh: () => onRefreshAds(context), onRefresh: () => onRefreshAds(context),
child: Consumer( child: Consumer(
builder: (BuildContext context, AdVM adVM, Widget? child) { builder: (BuildContext context, AdVM adVM, Widget? child) {
return BuildAdsList( return BuildAdsList(isAdsFragment: true, shouldShowAdStatus: !adVM.isExploreAdsTapped, adsList: getAdsList(adVM));
isAdsFragment: true,
shouldShowAdStatus: !adVM.isExploreAdsTapped,
adsList: adVM.isExploreAdsTapped && adVM.exploreAdsFilteredList.isNotEmpty
? adVM.exploreAdsFilteredList
: !adVM.isExploreAdsTapped && adVM.myAdsFilteredList.isNotEmpty
? adVM.myAdsFilteredList
: [],
);
}, },
), ),
), ),
@ -115,14 +121,11 @@ class AdsFragment extends StatelessWidget {
), ),
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: () { onPressed: () async {
context.read<AdVM>().getVehicleTypes(); navigateWithName(context, AppRoutes.selectAdTypeView, arguments: injector.get<AppState>().currentAppType == AppType.provider);
context.read<RequestsVM>().populateRequestsFilterList();
navigateWithName(context, AppRoutes.createAdView);
}, },
backgroundColor: MyColors.darkPrimaryColor, backgroundColor: MyColors.darkPrimaryColor,
child: const Icon( child: Icon(
Icons.add, Icons.add,
color: MyColors.white, color: MyColors.white,
), ),

@ -12,13 +12,15 @@ class AppMap extends StatefulWidget {
late AppMapState _state; late AppMapState _state;
final Function onMapCreated; final Function onMapCreated;
AppMap(this.initialCamera, {required this.onCameraMove, required this.onMapCreated}); AppMap(this.initialCamera,
{required this.onCameraMove, required this.onMapCreated});
@override @override
State<StatefulWidget> createState() => _state = AppMapState(); State<StatefulWidget> createState() => _state = AppMapState();
moveTo({required CameraPosition cameraPostion}) { moveTo({required CameraPosition cameraPostion}) {
_state.googleMapController.animateCamera(CameraUpdate.newCameraPosition(cameraPostion)); _state.googleMapController
.animateCamera(CameraUpdate.newCameraPosition(cameraPostion));
} }
} }
@ -35,6 +37,12 @@ class AppMapState extends State<AppMap> {
@override @override
void initState() {} void initState() {}
@override
void dispose() {
super.dispose();
googleMapController.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (isHuawei == null) return CircularProgressIndicator(); if (isHuawei == null) return CircularProgressIndicator();
@ -47,7 +55,9 @@ class AppMapState extends State<AppMap> {
zoomControlsEnabled: true, zoomControlsEnabled: true,
myLocationButtonEnabled: true, myLocationButtonEnabled: true,
myLocationEnabled: true, myLocationEnabled: true,
initialCameraPosition: CameraPosition.fromMap(widget.initialCamera) ?? const CameraPosition(target: LatLng(-26.1711459, 27.9002758), zoom: 2.0), initialCameraPosition: CameraPosition.fromMap(widget.initialCamera) ??
const CameraPosition(
target: LatLng(-26.1711459, 27.9002758), zoom: 2.0),
onCameraMove: widget.onCameraMove, onCameraMove: widget.onCameraMove,
onMapCreated: (GoogleMapController controller) { onMapCreated: (GoogleMapController controller) {
googleMapController = controller; googleMapController = controller;

@ -9,7 +9,7 @@ import 'package:car_provider_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:geocoding/geocoding.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'map_selection_widget.dart'; import 'map_selection_widget.dart';
@ -54,6 +54,11 @@ class _PickLocationPageState extends State<PickLocationPage> {
super.initState(); super.initState();
} }
@override
void dispose() {
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -117,10 +122,7 @@ class _PickLocationPageState extends State<PickLocationPage> {
Future<void> _updatePosition(CameraPosition _position) async { Future<void> _updatePosition(CameraPosition _position) async {
latitude = _position.target.latitude; latitude = _position.target.latitude;
longitude = _position.target.longitude; longitude = _position.target.longitude;
// List<Placemark> placemarks = await placemarkFromCoordinates(latitude, longitude); updateAddress(latitude, longitude);
// _counter.value = '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}';
print("Address121: " + _counter.value);
// _counter.value = (placemarks.first.name) ?? "" + " " + (placemarks.first.street ?? "") + " " + (placemarks.first.country ?? "");
} }
void _getUserLocation() async { void _getUserLocation() async {
@ -130,21 +132,32 @@ class _PickLocationPageState extends State<PickLocationPage> {
latitude = position.latitude; latitude = position.latitude;
longitude = position.longitude; longitude = position.longitude;
setMap(); setMap();
updateAddress(latitude, longitude);
} else { } else {
requestPermissions().then( requestPermissions().then(
(value) async { (value) async {
if (value[Permission.location]!.isGranted) { if (value[Permission.location]!.isGranted) {
var position = await GeolocatorPlatform.instance.getCurrentPosition(); var position =
await GeolocatorPlatform.instance.getCurrentPosition();
currentPostion = LatLng(position.latitude, position.longitude); currentPostion = LatLng(position.latitude, position.longitude);
latitude = position.latitude; latitude = position.latitude;
longitude = position.longitude; longitude = position.longitude;
setMap(); setMap();
updateAddress(latitude, longitude);
} }
}, },
); );
} }
} }
updateAddress(double latitude, double longitude) async {
// List<Placemark> placemarks =
// await placemarkFromCoordinates(latitude, longitude);
// _counter.value =
// '${placemarks.first.street}, ${placemarks.first.subLocality}, ${placemarks.first.locality}, ${placemarks.first.postalCode}, ${placemarks.first.country}';
// print("Address121: " + placemarks[0].toString());
}
setMap() { setMap() {
setState(() { setState(() {
_kGooglePlex = CameraPosition( _kGooglePlex = CameraPosition(

@ -165,7 +165,7 @@ class BranchDetailPage extends StatelessWidget {
); );
}), }),
categories.isEmpty categories.isEmpty
? LocaleKeys.no_branch.tr().toText(fontSize: 12) ? "No Service Added Yet".toText(fontSize: 12)
: ListView.separated( : ListView.separated(
itemBuilder: (context, pIndex) { itemBuilder: (context, pIndex) {
return InkWell( return InkWell(

@ -28,7 +28,8 @@ class DefineBranchPage extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
ServiceVM branchVM = context.read<ServiceVM>(); ServiceVM branchVM = context.read<ServiceVM>();
branchVM.getAllCountriesList(branchData, EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); branchVM.getAllCountriesList(branchData,
EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA");
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
title: LocaleKeys.defineBranches.tr(), title: LocaleKeys.defineBranches.tr(),
@ -50,9 +51,16 @@ class DefineBranchPage extends StatelessWidget {
model.country != null model.country != null
? DropdownField( ? DropdownField(
(DropValue value) { (DropValue value) {
model.countryValue =
DropValue(value.id, value.value, "");
model.countryCode = value.subValue; model.countryCode = value.subValue;
model.countryId = value.id; model.countryId = value.id;
model.getAllCities(branchData, EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); model.getAllCities(
branchData,
EasyLocalization.of(context)
?.currentLocale
?.countryCode ??
"SA");
}, },
list: model.countryDropList, list: model.countryDropList,
dropdownValue: model.countryValue, dropdownValue: model.countryValue,
@ -66,7 +74,8 @@ class DefineBranchPage extends StatelessWidget {
? Text(LocaleKeys.no_city_available.tr()) ? Text(LocaleKeys.no_city_available.tr())
: DropdownField( : DropdownField(
(DropValue value) { (DropValue value) {
// countryCode = value.subValue; model.cityValue = DropValue(
value.id, value.value, "");
model.setOnlyState(ViewState.busy); model.setOnlyState(ViewState.busy);
model.cityId = value.id; model.cityId = value.id;
model.setState(ViewState.idle); model.setState(ViewState.idle);
@ -111,7 +120,9 @@ class DefineBranchPage extends StatelessWidget {
navigateTo( navigateTo(
context, context,
PickLocationPage( PickLocationPage(
onPickAddress: (double latitude, double longitude, String address) { onPickAddress: (double latitude,
double longitude, String address) {
print("tesssgngl "+address);
model.latitude = latitude; model.latitude = latitude;
model.longitude = longitude; model.longitude = longitude;
model.address = address; model.address = address;
@ -125,12 +136,16 @@ class DefineBranchPage extends StatelessWidget {
height: 45, height: 45,
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.transparent, color: Colors.transparent,
border: Border.all(color: MyColors.darkPrimaryColor, width: 2), border: Border.all(
borderRadius: const BorderRadius.all(Radius.circular(8)), color: MyColors.darkPrimaryColor,
width: 2),
borderRadius: const BorderRadius.all(
Radius.circular(8)),
), ),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment:
CrossAxisAlignment.center,
children: [ children: [
const Icon( const Icon(
Icons.place_outlined, Icons.place_outlined,
@ -163,14 +178,24 @@ class DefineBranchPage extends StatelessWidget {
SizedBox( SizedBox(
width: double.infinity, width: double.infinity,
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 20, right: 20, bottom: 20), padding:
const EdgeInsets.only(left: 20, right: 20, bottom: 20),
child: ShowFillButton( child: ShowFillButton(
title: branchData != null ? (branchData!.id == null ? LocaleKeys.createBranch.tr() : LocaleKeys.updateBranch.tr()) : LocaleKeys.createBranch.tr(), title: branchData != null
? (branchData!.id == null
? LocaleKeys.createBranch.tr()
: LocaleKeys.updateBranch.tr())
: LocaleKeys.createBranch.tr(),
onPressed: () async { onPressed: () async {
if (branchData == null) { if (branchData == null) {
Utils.showLoading(context); Utils.showLoading(context);
MResponse res = MResponse res = await model.createBranch(
await model.createBranch(model.branchName, model.branchDescription, model.cityId.toString(), model.address, model.latitude.toString(), model.longitude.toString()); model.branchName,
model.branchDescription,
model.cityId.toString(),
model.address,
model.latitude.toString(),
model.longitude.toString());
Utils.hideLoading(context); Utils.hideLoading(context);
if (res.messageStatus == 1) { if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.branch_created.tr()); Utils.showToast(LocaleKeys.branch_created.tr());
@ -182,7 +207,13 @@ class DefineBranchPage extends StatelessWidget {
} else { } else {
Utils.showLoading(context); Utils.showLoading(context);
MResponse res = await model.updateBranch( MResponse res = await model.updateBranch(
branchData!.id ?? 0, model.branchName, model.branchDescription, model.cityId.toString(), model.address, model.latitude.toString(), model.longitude.toString()); branchData!.id ?? 0,
model.branchName,
model.branchDescription,
model.cityId.toString(),
model.address,
model.latitude.toString(),
model.longitude.toString());
Utils.hideLoading(context); Utils.hideLoading(context);
if (res.messageStatus == 1) { if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.branch_updated.tr()); Utils.showToast(LocaleKeys.branch_updated.tr());

@ -1,4 +1,3 @@
import 'package:car_provider_app/view_models/schedule_view_model.dart'; import 'package:car_provider_app/view_models/schedule_view_model.dart';
import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/chips_picker_item.dart';
import 'package:car_provider_app/views/settings/schedule/widgets/select_days_sheet.dart'; import 'package:car_provider_app/views/settings/schedule/widgets/select_days_sheet.dart';
@ -10,6 +9,7 @@ import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/general_models/m_response.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart'; import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
@ -19,15 +19,24 @@ import 'package:mc_common_app/widgets/bottom_sheet.dart';
class AddSchedulesPage extends StatelessWidget { class AddSchedulesPage extends StatelessWidget {
late ScheduleVM mModel; late ScheduleVM mModel;
String name = "", startDate = "", endDate = "", startTime = "", endTime = "", slotsTime = "", appointmentPerSlot = "", servicesGroupID = ""; String name = "",
startDate = "",
endDate = "",
startTime = "",
endTime = "",
slotsTime = "",
appointmentPerSlot = "",
servicesGroupID = "";
late ScheduleData scheduleData; late ScheduleData scheduleData;
AddSchedulesPage({Key? key}) : super(key: key); AddSchedulesPage({Key? key}) : super(key: key);
setEditData() { setEditData() {
name = scheduleData.scheduleName ?? ""; name = scheduleData.scheduleName ?? "";
startDate = DateHelper.formatAsYearMonthDay(scheduleData.fromDate ?? DateTime.now()); startDate = DateHelper.formatAsYearMonthDay(
endDate = DateHelper.formatAsYearMonthDay(scheduleData.toDate ?? DateTime.now()); scheduleData.fromDate ?? DateTime.now());
endDate =
DateHelper.formatAsYearMonthDay(scheduleData.toDate ?? DateTime.now());
startTime = scheduleData.startTime ?? ""; startTime = scheduleData.startTime ?? "";
endTime = scheduleData.endTime ?? ""; endTime = scheduleData.endTime ?? "";
slotsTime = scheduleData.slotDurationMinute.toString(); slotsTime = scheduleData.slotDurationMinute.toString();
@ -35,7 +44,9 @@ class AddSchedulesPage extends StatelessWidget {
// mModel.selectedServicesItems.clear(); // mModel.selectedServicesItems.clear();
scheduleData.scheduleServices?.forEach((element) { scheduleData.scheduleServices?.forEach((element) {
mModel.selectedServicesItems.add(PickerItem(id: element.providerServiceId ?? 0, title: element.providerServiceName ?? "")); mModel.selectedServicesItems.add(PickerItem(
id: element.providerServiceId ?? 0,
title: element.serviceDescription ?? ""));
}); });
mModel.selectedDaysItems.clear(); mModel.selectedDaysItems.clear();
scheduleData.weeklyOffDays?.forEach((element) { scheduleData.weeklyOffDays?.forEach((element) {
@ -134,7 +145,7 @@ class AddSchedulesPage extends StatelessWidget {
), ),
8.height, 8.height,
ChipsPickerItem( ChipsPickerItem(
hint: 'Days', hint: 'Off Days',
itemsList: [...model.selectedDaysItems], itemsList: [...model.selectedDaysItems],
onClick: () { onClick: () {
showMyBottomSheet( showMyBottomSheet(
@ -179,7 +190,12 @@ class AddSchedulesPage extends StatelessWidget {
isNeedClickAll: true, isNeedClickAll: true,
onTap: () async { onTap: () async {
TimeOfDay _startTime = TimeOfDay.now(); TimeOfDay _startTime = TimeOfDay.now();
if (startTime.isNotEmpty) _startTime = TimeOfDay(hour: int.parse(startTime.split(":")[0]), minute: int.parse(startTime.split(":")[1])); if (startTime.isNotEmpty)
_startTime = TimeOfDay(
hour:
int.parse(startTime.split(":")[0]),
minute:
int.parse(startTime.split(":")[1]));
endTime = await Utils.pickTime( endTime = await Utils.pickTime(
context, context,
initialTime: _startTime, initialTime: _startTime,
@ -315,8 +331,11 @@ class AddSchedulesPage extends StatelessWidget {
Utils.hideLoading(context); Utils.hideLoading(context);
if (servicesResponse.messageStatus == 1) { if (servicesResponse.messageStatus == 1) {
Utils.showToast("Successfully schedule created"); Utils.showToast("Successfully schedule created");
context.read<ScheduleVM>().getSchedules(scheduleData.branchId ?? "");
pop(context);
} else { } else {
Utils.showToast("Something went wrong while adding services in schedule"); Utils.showToast(
"Something went wrong while adding services in schedule");
} }
} else { } else {
Utils.hideLoading(context); Utils.hideLoading(context);
@ -362,8 +381,11 @@ class AddSchedulesPage extends StatelessWidget {
Utils.hideLoading(context); Utils.hideLoading(context);
if (servicesResponse.messageStatus == 1) { if (servicesResponse.messageStatus == 1) {
Utils.showToast("Successfully schedule updated"); Utils.showToast("Successfully schedule updated");
context.read<ScheduleVM>().getSchedules(scheduleData.branchId ?? "");
pop(context);
} else { } else {
Utils.showToast("Something went wrong while adding services in schedule"); Utils.showToast(
"Something went wrong while adding services in schedule");
} }
} else { } else {
Utils.hideLoading(context); Utils.hideLoading(context);

@ -58,7 +58,10 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
Row( Row(
children: [ children: [
Expanded( Expanded(
child: value.schedule!.data![index].scheduleName.toString().toText( child: value.schedule!.data![index]
.scheduleName
.toString()
.toText(
fontSize: 16, fontSize: 16,
isBold: true, isBold: true,
), ),
@ -71,33 +74,81 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
height: 16, height: 16,
), ),
).onPress(() { ).onPress(() {
value.schedule!.data![index].branchId = widget.branchId ?? ""; value.schedule!.data![index]
navigateWithName(context, ProviderAppRoutes.addSchedule, arguments: value.schedule!.data![index]); .branchId = widget.branchId ?? "";
navigateWithName(context,
ProviderAppRoutes.addSchedule,
arguments:
value.schedule!.data![index]);
}), }),
], ],
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment:
CrossAxisAlignment.center,
), ),
12.height, 12.height,
showItem("Start Date:", DateHelper.formatAsDayMonthYear(value.schedule!.data![index].fromDate)), showItem(
showItem("End Date:", DateHelper.formatAsDayMonthYear(value.schedule!.data![index].toDate)), "Start Date:",
showItem("Off Days:", DateHelper.formatAsDayMonthYear(value.schedule!.data![index].fromDate)), DateHelper.formatAsDayMonthYear(value
showItem("Shift Start Time:", value.schedule!.data![index].startTime ?? ""), .schedule!.data![index].fromDate)),
showItem("Shift End Time:", value.schedule!.data![index].startTime ?? ""), showItem(
showItem("Slots Time:", value.schedule!.data![index].slotDurationMinute.toString() + " Mins"), "End Date:",
showItem("Appointments Per Slot:", value.schedule!.data![index].perSlotAppointment.toString()), DateHelper.formatAsDayMonthYear(value
showItem("Off Days", offDays(value.schedule!.data![index])), .schedule!.data![index].toDate)),
showItem(
"Off Days:",
DateHelper.formatAsDayMonthYear(value
.schedule!.data![index].fromDate)),
showItem(
"Shift Start Time:",
value.schedule!.data![index]
.startTime ??
""),
showItem(
"Shift End Time:",
value.schedule!.data![index]
.startTime ??
""),
showItem(
"Slots Time:",
value.schedule!.data![index]
.slotDurationMinute
.toString() +
" Mins"),
showItem(
"Appointments Per Slot:",
value.schedule!.data![index]
.perSlotAppointment
.toString()),
showItem("Off Days",
offDays(value.schedule!.data![index])),
12.height, 12.height,
"Services:".toText(fontSize: 12, isBold: true, color: MyColors.lightTextColor), "Services:".toText(
fontSize: 12,
isBold: true,
color: MyColors.lightTextColor),
Column( Column(
children: value.schedule!.data![index].scheduleServices! crossAxisAlignment:
.map((element) => Container(child: element.providerServiceName.toString().toText(fontSize: 12, isBold: true))) CrossAxisAlignment.start,
children: value.schedule!.data![index]
.scheduleServices!
.map(
(element) => Container(
child: element.serviceDescription
.toString()
.toText(
fontSize: 12,
isBold: true,
),
),
)
.toList(), .toList(),
crossAxisAlignment: CrossAxisAlignment.start,
) )
], ],
).toWhiteContainer(width: double.infinity, allPading: 12); ).toWhiteContainer(
width: double.infinity, allPading: 12);
}, },
separatorBuilder: (BuildContext context, int index) { separatorBuilder:
(BuildContext context, int index) {
return 12.height; return 12.height;
}, },
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),
@ -111,7 +162,8 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
maxWidth: double.infinity, maxWidth: double.infinity,
margin: const EdgeInsets.all(20), margin: const EdgeInsets.all(20),
onPressed: () { onPressed: () {
navigateWithName(context, ProviderAppRoutes.addSchedule, arguments: ScheduleData(branchId: widget.branchId ?? "")); navigateWithName(context, ProviderAppRoutes.addSchedule,
arguments: ScheduleData(branchId: widget.branchId ?? ""));
}, },
), ),
], ],
@ -123,7 +175,8 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
String offDays(ScheduleData scheduleData) { String offDays(ScheduleData scheduleData) {
String offDays = ""; String offDays = "";
for (int i = 0; i < scheduleData.weeklyOffDays!.length; i++) { for (int i = 0; i < scheduleData.weeklyOffDays!.length; i++) {
offDays = offDays + initDaysList[scheduleData.weeklyOffDays![i].dayNumber! - 1].title; offDays = offDays +
initDaysList[scheduleData.weeklyOffDays![i].dayNumber! - 1].title;
if (i != scheduleData.weeklyOffDays!.length - 1) { if (i != scheduleData.weeklyOffDays!.length - 1) {
offDays = offDays + " , "; offDays = offDays + " , ";
} }
@ -134,7 +187,8 @@ class _SchedulesListPageState extends State<SchedulesListPage> {
Widget showItem(String title, String value) { Widget showItem(String title, String value) {
return Row( return Row(
children: [ children: [
title.toText(fontSize: 12, isBold: true, color: MyColors.lightTextColor), title.toText(
fontSize: 12, isBold: true, color: MyColors.lightTextColor),
4.width, 4.width,
value.toText(fontSize: 12, isBold: true), value.toText(fontSize: 12, isBold: true),
], ],

@ -1,4 +1,3 @@
import 'package:car_provider_app/generated/locale_keys.g.dart'; import 'package:car_provider_app/generated/locale_keys.g.dart';
import 'package:car_provider_app/view_models/service_view_model.dart'; import 'package:car_provider_app/view_models/service_view_model.dart';
import 'package:car_provider_app/views/settings/services/services_list_page.dart'; import 'package:car_provider_app/views/settings/services/services_list_page.dart';
@ -29,20 +28,26 @@ class CreateServicesPage3 extends StatelessWidget {
String chargersPerKm = "0"; String chargersPerKm = "0";
int? categoryId; int? categoryId;
int? serviceId = -1; int? serviceId = -1;
DropValue? category;
DropValue? service;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
ServiceVM serviceVM = context.read<ServiceVM>(); ServiceVM serviceVM = context.read<ServiceVM>();
if (branchModel!.categoryId == null) { if (branchModel!.categoryId == null) {
serviceVM.fetchBranchCategory(EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA"); serviceVM.fetchBranchCategory(
EasyLocalization.of(context)?.currentLocale?.countryCode ?? "SA");
} else { } else {
isAppointmentAvailable = branchModel?.serviceProviderService?.isAllowAppointment ?? false; isAppointmentAvailable =
branchModel?.serviceProviderService?.isAllowAppointment ?? false;
// isHomeAppointmentAvailable=branchModel.serviceProviderService. // isHomeAppointmentAvailable=branchModel.serviceProviderService.
serviceRage = branchModel?.serviceProviderService?.customerLocationRange ?? 0; serviceRage =
branchModel?.serviceProviderService?.customerLocationRange ?? 0;
if (serviceRage > 0) { if (serviceRage > 0) {
isHomeAppointmentAvailable = true; isHomeAppointmentAvailable = true;
} }
chargersPerKm = branchModel?.serviceProviderService?.rangePricePerKm ?? "0"; chargersPerKm =
branchModel?.serviceProviderService?.rangePricePerKm ?? "0";
serviceId = branchModel?.serviceProviderService?.serviceId ?? -1; serviceId = branchModel?.serviceProviderService?.serviceId ?? -1;
} }
return Scaffold( return Scaffold(
@ -67,7 +72,8 @@ class CreateServicesPage3 extends StatelessWidget {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
).toContainer( ).toContainer(
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12), padding: const EdgeInsets.only(
left: 8, right: 8, bottom: 12, top: 12),
backgroundColor: MyColors.textFieldColor, backgroundColor: MyColors.textFieldColor,
borderRadius: 0, borderRadius: 0,
width: double.infinity, width: double.infinity,
@ -81,34 +87,44 @@ class CreateServicesPage3 extends StatelessWidget {
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
).toContainer( ).toContainer(
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12), padding: const EdgeInsets.only(
left: 8, right: 8, bottom: 12, top: 12),
backgroundColor: MyColors.textFieldColor, backgroundColor: MyColors.textFieldColor,
borderRadius: 0, borderRadius: 0,
width: double.infinity, width: double.infinity,
) )
: (branchModel!.categoryId == null && model.categoryDropList.isNotEmpty) : (branchModel!.categoryId == null &&
model.categoryDropList.isNotEmpty)
? DropdownField( ? DropdownField(
(DropValue value) async { (DropValue value) async {
categoryId = value.id; categoryId = value.id;
category = value;
service = null;
serviceId = -1; serviceId = -1;
isAppointmentAvailable = false; isAppointmentAvailable = false;
isHomeAppointmentAvailable = false; isHomeAppointmentAvailable = false;
model.fetchServicesByCategoryId(value.id.toString()); model.fetchServicesByCategoryId(
value.id.toString());
}, },
dropdownValue: category,
list: model.categoryDropList, list: model.categoryDropList,
hint: LocaleKeys.selectServiceCategory.tr(), hint:
LocaleKeys.selectServiceCategory.tr(),
) )
: const CircularProgressIndicator(), : const CircularProgressIndicator(),
12.height, 12.height,
branchModel!.serviceProviderService != null branchModel!.serviceProviderService != null
? Text( ? Text(
branchModel!.serviceProviderService!.serviceDescription ?? "N/A", branchModel!.serviceProviderService!
.serviceDescription ??
"N/A",
style: const TextStyle( style: const TextStyle(
fontSize: 12, fontSize: 12,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
), ),
).toContainer( ).toContainer(
padding: const EdgeInsets.only(left: 8, right: 8, bottom: 12, top: 12), padding: const EdgeInsets.only(
left: 8, right: 8, bottom: 12, top: 12),
backgroundColor: MyColors.textFieldColor, backgroundColor: MyColors.textFieldColor,
borderRadius: 0, borderRadius: 0,
width: double.infinity, width: double.infinity,
@ -117,10 +133,12 @@ class CreateServicesPage3 extends StatelessWidget {
? DropdownField( ? DropdownField(
(DropValue value) { (DropValue value) {
serviceId = value.id; serviceId = value.id;
service = value;
isAppointmentAvailable = false; isAppointmentAvailable = false;
isHomeAppointmentAvailable = false; isHomeAppointmentAvailable = false;
model.setState(ViewState.idle); model.setState(ViewState.idle);
}, },
dropdownValue: service,
list: model.servicesDropList, list: model.servicesDropList,
hint: LocaleKeys.defineServices.tr(), hint: LocaleKeys.defineServices.tr(),
) )
@ -135,7 +153,8 @@ class CreateServicesPage3 extends StatelessWidget {
CheckBoxWithTitleDescription( CheckBoxWithTitleDescription(
isSelected: isAppointmentAvailable, isSelected: isAppointmentAvailable,
title: 'Available for appointment', title: 'Available for appointment',
description: 'This option will allow customer to book appointment for these services', description:
'This option will allow customer to book appointment for these services',
onSelection: (bool v) { onSelection: (bool v) {
isAppointmentAvailable = v; isAppointmentAvailable = v;
model.setState(ViewState.idle); model.setState(ViewState.idle);
@ -145,7 +164,8 @@ class CreateServicesPage3 extends StatelessWidget {
CheckBoxWithTitleDescription( CheckBoxWithTitleDescription(
isSelected: isHomeAppointmentAvailable, isSelected: isHomeAppointmentAvailable,
title: 'Allow home services', title: 'Allow home services',
description: 'This option will allow customer to book appointment at their desired location', description:
'This option will allow customer to book appointment at their desired location',
onSelection: (bool v) { onSelection: (bool v) {
isHomeAppointmentAvailable = v; isHomeAppointmentAvailable = v;
model.setState(ViewState.idle); model.setState(ViewState.idle);
@ -158,13 +178,18 @@ class CreateServicesPage3 extends StatelessWidget {
TxtField( TxtField(
hint: "Home Services Range", hint: "Home Services Range",
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
value: serviceRage == 0 ? null : serviceRage.toString(), value: serviceRage == 0
? null
: serviceRage.toString(),
postfixWidget: Row( postfixWidget: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment:
mainAxisAlignment: MainAxisAlignment.center, CrossAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [ children: [
"KM".toText(color: MyColors.lightTextColor), "KM".toText(
color: MyColors.lightTextColor),
], ],
), ),
onChanged: (v) { onChanged: (v) {
@ -179,7 +204,9 @@ class CreateServicesPage3 extends StatelessWidget {
TxtField( TxtField(
hint: "Charges per Kilometer", hint: "Charges per Kilometer",
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
value: chargersPerKm == "0.0" ? null : chargersPerKm, value: chargersPerKm == "0.0"
? null
: chargersPerKm,
onChanged: (v) { onChanged: (v) {
if (v.isNotEmpty) { if (v.isNotEmpty) {
chargersPerKm = v; chargersPerKm = v;

@ -269,6 +269,38 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.2.2" version: "8.2.2"
geocoding:
dependency: transitive
description:
name: geocoding
sha256: e1dc0ac56666d9ed1d5a9ae5543ce9eb5986db6209cc7600103487d09192059c
url: "https://pub.dev"
source: hosted
version: "2.1.1"
geocoding_android:
dependency: transitive
description:
name: geocoding_android
sha256: "609db1d71bc364dd9d0616f72a41c01e0c74f3a3807efb85e0d5a67e57baf50f"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
geocoding_ios:
dependency: transitive
description:
name: geocoding_ios
sha256: "8f79e380abb640ef4d88baee8bb65390058c802601158d0813dc990b36b189d2"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
geocoding_platform_interface:
dependency: transitive
description:
name: geocoding_platform_interface
sha256: "8848605d307d844d89937cdb4b8ad7dfa880552078f310fa24d8a460f6dddab4"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
geolocator: geolocator:
dependency: transitive dependency: transitive
description: description:

Loading…
Cancel
Save