Merge pull request 'suggested design changes fixed. faiz_dev' (#138) from faiz_dev into master

Reviewed-on: https://34.17.182.140/Haroon6138/HMG_Patient_App_New/pulls/138
pull/147/head
Haroon6138 2 weeks ago
commit cc7239a473

@ -18,6 +18,7 @@ import 'package:hmg_patient_app_new/routes/app_routes.dart';
import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart';
import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart';
import 'package:hmg_patient_app_new/services/notification_service.dart'; import 'package:hmg_patient_app_new/services/notification_service.dart';
import 'package:hmg_patient_app_new/theme/colors.dart';
class WaterMonitorViewModel extends ChangeNotifier { class WaterMonitorViewModel extends ChangeNotifier {
WaterMonitorRepo waterMonitorRepo; WaterMonitorRepo waterMonitorRepo;
@ -277,7 +278,7 @@ class WaterMonitorViewModel extends ChangeNotifier {
} }
} }
Future<void> fetchUserDetailsForMonitoring() async { Future<void> fetchUserDetailsForMonitoring({Function(dynamic)? onSuccess, Function(String)? onError}) async {
try { try {
_isLoading = true; _isLoading = true;
@ -287,14 +288,21 @@ class WaterMonitorViewModel extends ChangeNotifier {
if (authenticated == null) { if (authenticated == null) {
_isLoading = false; _isLoading = false;
notifyListeners(); notifyListeners();
if (onError != null) onError('User not authenticated');
return; return;
} }
final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', ''); final mobile = (authenticated.mobileNumber ?? '').replaceAll('+', '');
final identification = authenticated.patientIdentificationNo ?? ''; final identification = authenticated.patientIdentificationNo ?? '';
final result = await waterMonitorRepo.getUserDetailsForWaterMonitoring(progress: 1, mobileNumber: mobile, identificationNo: identification); final result = await waterMonitorRepo.getUserDetailsForWaterMonitoring(
progress: 1,
mobileNumber: mobile,
identificationNo: identification,
);
result.fold((failure) { result.fold((failure) {
_userDetailData = null; _userDetailData = null;
if (onError != null) onError(failure.message);
}, (apiModel) { }, (apiModel) {
_userDetailData = apiModel.data; _userDetailData = apiModel.data;
@ -302,9 +310,12 @@ class WaterMonitorViewModel extends ChangeNotifier {
if (_userDetailData != null) { if (_userDetailData != null) {
_populateFormFields(_userDetailData); _populateFormFields(_userDetailData);
} }
if (onSuccess != null) onSuccess(_userDetailData);
}); });
} catch (e) { } catch (e) {
_userDetailData = null; _userDetailData = null;
if (onError != null) onError(e.toString());
} finally { } finally {
_isLoading = false; _isLoading = false;
notifyListeners(); notifyListeners();
@ -424,6 +435,48 @@ class WaterMonitorViewModel extends ChangeNotifier {
} }
} }
/// Populate form fields from authenticated user data (for new users)
void populateFromAuthenticatedUser() {
try {
final authenticated = _appState.getAuthenticatedUser();
if (authenticated == null) return;
// Name - use firstName if available
if (authenticated.firstName != null && authenticated.firstName!.isNotEmpty) {
nameController.text = authenticated.firstName!;
}
// Gender - map from patient gender
if (authenticated.gender != null) {
final gender = (authenticated.gender == 1 ? 'male' : 'female').toLowerCase();
if (gender.contains('m') || gender == 'male') {
_selectedGender = 'Male';
} else if (gender.contains('f') || gender == 'female') {
_selectedGender = 'Female';
}
}
// Age - calculate from DOB if available
if (authenticated.dateofBirth != null && authenticated.dateofBirth!.isNotEmpty) {
final age = _calculateAgeFromDOB(authenticated.dateofBirth!);
if (age > 0) {
ageController.text = age.toString();
}
}
// Set default units and activity level
_selectedHeightUnit = 'cm';
_selectedWeightUnit = 'kg';
_selectedActivityLevel = 'Lightly active';
_selectedNumberOfReminders = '3 Time';
log('Form fields populated from authenticated user: ${authenticated.firstName}');
notifyListeners();
} catch (e) {
log('Error populating from authenticated user: $e');
}
}
// Reset all fields to default // Reset all fields to default
void resetFields() { void resetFields() {
nameController.clear(); nameController.clear();
@ -755,15 +808,15 @@ class WaterMonitorViewModel extends ChangeNotifier {
final percent = progressPercent; final percent = progressPercent;
if (percent >= 90) { if (percent >= 90) {
return const Color(0xFF00C853); // Dark Green return AppColors.successColor; // Dark Green
} else if (percent >= 70) { } else if (percent >= 70) {
return const Color(0xFF4CAF50); // Green return AppColors.successColor; // Green
} else if (percent >= 50) { } else if (percent >= 50) {
return const Color(0xFFFFC107); // Amber return AppColors.warningColorYellow; //orange
} else if (percent >= 30) { } else if (percent >= 30) {
return const Color(0xFFFF9800); // Orange return AppColors.warningColorYellow; // Orange
} else { } else {
return const Color(0xFFF44336); // Red return AppColors.errorColor; // Red
} }
} }

@ -6,12 +6,14 @@ import 'package:hmg_patient_app_new/core/app_assets.dart';
import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_export.dart';
import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/enums.dart';
import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart';
import 'package:hmg_patient_app_new/extensions/route_extensions.dart';
import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart';
import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart';
import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_view_model.dart'; import 'package:hmg_patient_app_new/features/blood_donation/blood_donation_view_model.dart';
import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart';
import 'package:hmg_patient_app_new/features/hmg_services/models/ui_models/hmg_services_component_model.dart'; import 'package:hmg_patient_app_new/features/hmg_services/models/ui_models/hmg_services_component_model.dart';
import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart';
import 'package:hmg_patient_app_new/features/water_monitor/water_monitor_view_model.dart';
import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart';
import 'package:hmg_patient_app_new/presentation/blood_donation/blood_donation_page.dart'; import 'package:hmg_patient_app_new/presentation/blood_donation/blood_donation_page.dart';
import 'package:hmg_patient_app_new/presentation/contact_us/contact_us.dart'; import 'package:hmg_patient_app_new/presentation/contact_us/contact_us.dart';
@ -87,12 +89,12 @@ class ServicesPage extends StatelessWidget {
LoaderBottomSheet.showLoader(loadingText: "Fetching Data..."); LoaderBottomSheet.showLoader(loadingText: "Fetching Data...");
await bloodDonationViewModel.getRegionSelectedClinics(onSuccess: (val) async { await bloodDonationViewModel.getRegionSelectedClinics(onSuccess: (val) async {
// await bloodDonationViewModel.getPatientBloodGroupDetails(onSuccess: (val) { // await bloodDonationViewModel.getPatientBloodGroupDetails(onSuccess: (val) {
LoaderBottomSheet.hideLoader(); LoaderBottomSheet.hideLoader();
Navigator.of(GetIt.instance<NavigationService>().navigatorKey.currentContext!).push( Navigator.of(GetIt.instance<NavigationService>().navigatorKey.currentContext!).push(
CustomPageRoute( CustomPageRoute(
page: BloodDonationPage(), page: BloodDonationPage(),
), ),
); );
// }, onError: (err) { // }, onError: (err) {
// LoaderBottomSheet.hideLoader(); // LoaderBottomSheet.hideLoader();
// }); // });
@ -153,7 +155,27 @@ class ServicesPage extends StatelessWidget {
AppAssets.daily_water_monitor_icon, AppAssets.daily_water_monitor_icon,
bgColor: AppColors.whiteColor, bgColor: AppColors.whiteColor,
true, true,
route: AppRoutes.waterConsumptionScreen, route: null, // Set to null since we handle navigation in onTap
onTap: () async {
LoaderBottomSheet.showLoader(loadingText: "Fetching your water intake details.".needTranslation);
final waterMonitorVM = getIt.get<WaterMonitorViewModel>();
final context = getIt.get<NavigationService>().navigatorKey.currentContext!;
await waterMonitorVM.fetchUserDetailsForMonitoring(
onSuccess: (userDetail) {
LoaderBottomSheet.hideLoader();
if (userDetail == null) {
waterMonitorVM.populateFromAuthenticatedUser();
context.navigateWithName(AppRoutes.waterMonitorSettingsScreen);
} else {
context.navigateWithName(AppRoutes.waterConsumptionScreen);
}
},
onError: (error) {
LoaderBottomSheet.hideLoader();
context.navigateWithName(AppRoutes.waterConsumptionScreen);
},
);
},
), ),
HmgServicesComponentModel( HmgServicesComponentModel(
11, 11,

@ -126,14 +126,27 @@ class _WaterConsumptionScreenState extends State<WaterConsumptionScreen> {
), ),
SizedBox(width: 8.w), SizedBox(width: 8.w),
InkWell( InkWell(
onTap: () => _showHistoryDurationBottomsheet(context, viewModel), onTap: () => _showHistoryDurationBottomsheet(context, viewModel),
child: Utils.buildSvgWithAssets(icon: AppAssets.doctor_calendar_icon, height: 24.h, width: 24.h)) child: Container(
padding: EdgeInsets.symmetric(vertical: 6.h, horizontal: 6.h),
decoration: RoundedRectangleBorder().toSmoothCornerDecoration(
backgroundColor: AppColors.greyColor,
borderRadius: 8.r,
hasShadow: true,
),
child: Row(
children: [
viewModel.selectedDurationFilter.toText12(fontWeight: FontWeight.w500),
Utils.buildSvgWithAssets(icon: AppAssets.arrow_down),
],
),
),
)
], ],
), ),
], ],
), ),
SizedBox(height: 12.h), if (!viewModel.isGraphView) _buildHistoryListView(viewModel) else ...[SizedBox(height: 16.h), _buildHistoryGraph()]
if (!viewModel.isGraphView) _buildHistoryListView(viewModel) else _buildHistoryGraph()
], ],
); );
}), }),
@ -450,6 +463,7 @@ class _WaterConsumptionScreenState extends State<WaterConsumptionScreen> {
showGridLines: true, showGridLines: true,
maxY: maxY, maxY: maxY,
minY: minY, minY: minY,
showLinePoints: true,
maxX: dataPoints.length > 1 ? dataPoints.length.toDouble() - 0.75 : 1.0, maxX: dataPoints.length > 1 ? dataPoints.length.toDouble() - 0.75 : 1.0,
horizontalInterval: horizontalInterval, horizontalInterval: horizontalInterval,
leftLabelInterval: leftLabelInterval, leftLabelInterval: leftLabelInterval,
@ -515,7 +529,7 @@ class _WaterConsumptionScreenState extends State<WaterConsumptionScreen> {
// For daily, show all 7 time labels (last 7 entries) // For daily, show all 7 time labels (last 7 entries)
if (selectedDuration == 'Daily' && index < 7) { if (selectedDuration == 'Daily' && index < 7) {
return Padding( return Padding(
padding: EdgeInsets.only(top: 5.h), padding: EdgeInsets.only(top: 10.h),
child: data[index].label.toText8( child: data[index].label.toText8(
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
color: AppColors.labelTextColor, color: AppColors.labelTextColor,
@ -526,7 +540,7 @@ class _WaterConsumptionScreenState extends State<WaterConsumptionScreen> {
// For weekly, show all 7 days (today + last 6 days) // For weekly, show all 7 days (today + last 6 days)
if (selectedDuration == 'Weekly' && index < 7) { if (selectedDuration == 'Weekly' && index < 7) {
return Padding( return Padding(
padding: EdgeInsets.only(top: 5.h), padding: EdgeInsets.only(top: 10.h),
child: data[index].label.toText10( child: data[index].label.toText10(
weight: FontWeight.w600, weight: FontWeight.w600,
color: AppColors.labelTextColor, color: AppColors.labelTextColor,
@ -537,11 +551,8 @@ class _WaterConsumptionScreenState extends State<WaterConsumptionScreen> {
// For monthly, show all 7 months (current month + last 6 months) // For monthly, show all 7 months (current month + last 6 months)
if (selectedDuration == 'Monthly' && index < 7) { if (selectedDuration == 'Monthly' && index < 7) {
return Padding( return Padding(
padding: EdgeInsets.only(top: 5.h), padding: EdgeInsets.only(top: 10.h),
child: data[index].label.toText10( child: data[index].label.toText10(weight: FontWeight.w600, color: AppColors.labelTextColor),
weight: FontWeight.w600,
color: AppColors.labelTextColor,
),
); );
} }

@ -142,10 +142,10 @@ class _WaterMonitorSettingsScreenState extends State<WaterMonitorSettingsScreen>
} }
// Reusable method to build text field // Reusable method to build text field
Widget _buildTextField(TextEditingController controller, String hintText) { Widget _buildTextField(TextEditingController controller, String hintText, {TextInputType keyboardType = TextInputType.name}) {
return TextField( return TextField(
controller: controller, controller: controller,
keyboardType: TextInputType.number, keyboardType: keyboardType,
maxLines: 1, maxLines: 1,
cursorHeight: 14.h, cursorHeight: 14.h,
textAlignVertical: TextAlignVertical.center, textAlignVertical: TextAlignVertical.center,
@ -293,19 +293,31 @@ class _WaterMonitorSettingsScreenState extends State<WaterMonitorSettingsScreen>
_buildSettingsRow( _buildSettingsRow(
icon: AppAssets.calendarGrey, icon: AppAssets.calendarGrey,
label: "Age (11-120) yrs".needTranslation, label: "Age (11-120) yrs".needTranslation,
inputField: _buildTextField(viewModel.ageController, '20'), inputField: _buildTextField(
viewModel.ageController,
'20',
keyboardType: TextInputType.number,
),
), ),
_buildSettingsRow( _buildSettingsRow(
icon: AppAssets.heightIcon, icon: AppAssets.heightIcon,
label: "Height".needTranslation, label: "Height".needTranslation,
inputField: _buildTextField(viewModel.heightController, '175'), inputField: _buildTextField(
viewModel.heightController,
'175',
keyboardType: TextInputType.number,
),
unit: viewModel.selectedHeightUnit, unit: viewModel.selectedHeightUnit,
onUnitTap: () => _showHeightUnitSelectionBottomSheet(context, viewModel), onUnitTap: () => _showHeightUnitSelectionBottomSheet(context, viewModel),
), ),
_buildSettingsRow( _buildSettingsRow(
icon: AppAssets.weightScaleIcon, icon: AppAssets.weightScaleIcon,
label: "Weight".needTranslation, label: "Weight".needTranslation,
inputField: _buildTextField(viewModel.weightController, '75'), inputField: _buildTextField(
viewModel.weightController,
'75',
keyboardType: TextInputType.number,
),
unit: viewModel.selectedWeightUnit, unit: viewModel.selectedWeightUnit,
onUnitTap: () => _showWeightUnitSelectionBottomsheet(context, viewModel), onUnitTap: () => _showWeightUnitSelectionBottomsheet(context, viewModel),
), ),

@ -313,6 +313,7 @@ class _CustomizeCupBottomSheetState extends State<CustomizeCupBottomSheet> {
viewModel.selectCup(newCup.id); viewModel.selectCup(newCup.id);
Navigator.pop(context); Navigator.pop(context);
Navigator.pop(context);
}, },
backgroundColor: AppColors.primaryRedColor, backgroundColor: AppColors.primaryRedColor,
textColor: AppColors.whiteColor, textColor: AppColors.whiteColor,

@ -17,6 +17,8 @@ class WaterActionButtonsWidget extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Consumer<WaterMonitorViewModel>(builder: (context, vm, _) { return Consumer<WaterMonitorViewModel>(builder: (context, vm, _) {
final cupAmount = vm.selectedCupCapacityMl; final cupAmount = vm.selectedCupCapacityMl;
final isGoalAchieved = vm.progressPercent >= 100 || vm.nextDrinkTime.toLowerCase().contains('goal achieved');
return Column( return Column(
children: [ children: [
Row( Row(
@ -48,16 +50,21 @@ class WaterActionButtonsWidget extends StatelessWidget {
color: AppColors.whiteColor, color: AppColors.whiteColor,
), ),
), ),
InkWell( Opacity(
onTap: () async { opacity: isGoalAchieved ? 0.4 : 1.0,
if (cupAmount > 0) { child: InkWell(
await vm.insertUserActivity(quantityIntake: cupAmount); onTap: isGoalAchieved
} ? null
}, : () async {
child: Utils.buildSvgWithAssets( if (cupAmount > 0) {
icon: AppAssets.addIconDark, await vm.insertUserActivity(quantityIntake: cupAmount);
height: 20.h, }
width: 20.h, },
child: Utils.buildSvgWithAssets(
icon: AppAssets.addIconDark,
height: 20.h,
width: 20.h,
),
), ),
), ),
], ],
@ -75,29 +82,7 @@ class WaterActionButtonsWidget extends StatelessWidget {
), ),
_buildActionButton( _buildActionButton(
context: context, context: context,
onTap: () async { onTap: () async {},
final success = await vm.scheduleTestNotification();
if (success) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Test notification will appear in 5 seconds!'.needTranslation),
backgroundColor: AppColors.blueColor,
behavior: SnackBarBehavior.floating,
margin: EdgeInsets.all(16.w),
duration: const Duration(seconds: 2),
),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Failed to schedule test notification'.needTranslation),
backgroundColor: AppColors.errorColor,
behavior: SnackBarBehavior.floating,
margin: EdgeInsets.all(16.w),
),
);
}
},
title: "Plain Water".needTranslation, title: "Plain Water".needTranslation,
icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w), icon: Utils.buildSvgWithAssets(icon: AppAssets.glassIcon, height: 24.w, width: 24.w),
), ),

@ -47,8 +47,19 @@ class WaterIntakeSummaryWidget extends StatelessWidget {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
"Next Drink Time".needTranslation.toText18(weight: FontWeight.w600, color: AppColors.textColor), // Don't show label if goal is achieved
vm.nextDrinkTime.toText32(weight: FontWeight.w600, color: AppColors.blueColor), if (!vm.nextDrinkTime.toLowerCase().contains('goal achieved'))
// Show "Tomorrow" if nextDrinkTime contains "tomorrow", otherwise "Next Drink Time"
(vm.nextDrinkTime.toLowerCase().contains('tomorrow') ? "Tomorrow" : "Next Drink Time")
.needTranslation
.toText18(weight: FontWeight.w600, color: AppColors.textColor),
// Extract only time if "tomorrow" is present, otherwise show as is
(vm.nextDrinkTime.toLowerCase().contains('tomorrow')
? vm.nextDrinkTime.replaceAll(RegExp(r'tomorrow', caseSensitive: false), '').trim()
: vm.nextDrinkTime)
.toText32(weight: FontWeight.w600, color: AppColors.blueColor),
SizedBox(height: 12.h), SizedBox(height: 12.h),
_buildStatusColumn(title: "Your Goal".needTranslation, subTitle: "${goalMl}ml"), _buildStatusColumn(title: "Your Goal".needTranslation, subTitle: "${goalMl}ml"),
SizedBox(height: 8.h), SizedBox(height: 8.h),

@ -78,7 +78,7 @@ class AppCustomChipWidget extends StatelessWidget {
fit: BoxFit.contain, fit: BoxFit.contain,
) )
: SizedBox.shrink(), : SizedBox.shrink(),
label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), label: richText ?? (labelText?? "").toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor),
padding: padding, padding: padding,
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
labelPadding: labelPadding ?? EdgeInsetsDirectional.only(end: deleteIcon?.isNotEmpty == true ? 2.w : 8.w), labelPadding: labelPadding ?? EdgeInsetsDirectional.only(end: deleteIcon?.isNotEmpty == true ? 2.w : 8.w),
@ -104,7 +104,7 @@ class AppCustomChipWidget extends StatelessWidget {
) )
: Chip( : Chip(
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor, isCenter: true), label: richText ?? (labelText?? "").toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor, isCenter: true),
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
shape: shape ?? shape: shape ??

@ -63,6 +63,7 @@ class CustomGraph extends StatelessWidget {
final double? horizontalInterval; final double? horizontalInterval;
final double? minY; final double? minY;
final bool showShadow; final bool showShadow;
final bool showLinePoints;
final double? cutOffY; final double? cutOffY;
final RangeAnnotations? rangeAnnotations; final RangeAnnotations? rangeAnnotations;
@ -104,6 +105,7 @@ class CustomGraph extends StatelessWidget {
this.horizontalInterval, this.horizontalInterval,
this.minY, this.minY,
this.showShadow = false, this.showShadow = false,
this.showLinePoints = false,
this.cutOffY = 0, this.cutOffY = 0,
this.rangeAnnotations}); this.rangeAnnotations});
@ -195,7 +197,7 @@ class CustomGraph extends StatelessWidget {
top: BorderSide.none, top: BorderSide.none,
), ),
), ),
lineBarsData: _buildColoredLineSegments(dataPoints), lineBarsData: _buildColoredLineSegments(dataPoints, showLinePoints),
gridData: FlGridData( gridData: FlGridData(
show: showGridLines ?? true, show: showGridLines ?? true,
drawVerticalLine: false, drawVerticalLine: false,
@ -217,7 +219,7 @@ class CustomGraph extends StatelessWidget {
); );
} }
List<LineChartBarData> _buildColoredLineSegments(List<DataPoint> dataPoints) { List<LineChartBarData> _buildColoredLineSegments(List<DataPoint> dataPoints, bool showLinePoints) {
final List<FlSpot> allSpots = dataPoints.asMap().entries.map((entry) { final List<FlSpot> allSpots = dataPoints.asMap().entries.map((entry) {
double value = (makeGraphBasedOnActualValue) ? double.tryParse(entry.value.actualValue) ?? 0.0 : entry.value.value; double value = (makeGraphBasedOnActualValue) ? double.tryParse(entry.value.actualValue) ?? 0.0 : entry.value.value;
return FlSpot(entry.key.toDouble(), value); return FlSpot(entry.key.toDouble(), value);
@ -235,9 +237,7 @@ class CustomGraph extends StatelessWidget {
begin: Alignment.centerLeft, begin: Alignment.centerLeft,
end: Alignment.centerRight, end: Alignment.centerRight,
), ),
dotData: FlDotData( dotData: FlDotData(show: showLinePoints),
show: false,
),
belowBarData: BarAreaData( belowBarData: BarAreaData(
show: showShadow, show: showShadow,
applyCutOffY: cutOffY != null, applyCutOffY: cutOffY != null,

Loading…
Cancel
Save