Fix(bugs): Handle Touch PieChart

This commit is contained in:
anhtunz
2025-04-03 10:44:29 +07:00
parent b830d76d23
commit 6230036c04
4 changed files with 89 additions and 82 deletions

View File

@@ -371,6 +371,7 @@ class TagState extends StatelessWidget {
child: const Icon( child: const Icon(
Icons.close, Icons.close,
size: 20, size: 20,
color: Colors.white,
), ),
), ),
], ],

View File

@@ -189,7 +189,6 @@ class _MainScreenState extends State<MainScreen> with WidgetsBindingObserver {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StreamBuilder<bool>( return StreamBuilder<bool>(
stream: mainBloc.streamThemeMode, stream: mainBloc.streamThemeMode,
initialData: isLight, initialData: isLight,

View File

@@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:sfm_app/product/constant/status_code/status_code_constants.dart'; import '../constant/status_code/status_code_constants.dart';
import '../cache/local_manager.dart'; import '../cache/local_manager.dart';
import '../constant/app/app_constants.dart'; import '../constant/app/app_constants.dart';

View File

@@ -10,10 +10,7 @@ import '../services/language_services.dart';
import '../constant/app/app_constants.dart'; import '../constant/app/app_constants.dart';
class SharedPieChart extends StatefulWidget { class SharedPieChart extends StatefulWidget {
const SharedPieChart( const SharedPieChart({super.key, required this.deviceByState, required this.devicesManagerBloc});
{super.key,
required this.deviceByState,
required this.devicesManagerBloc});
final Map<String, List<Device>> deviceByState; final Map<String, List<Device>> deviceByState;
final DevicesManagerBloc devicesManagerBloc; final DevicesManagerBloc devicesManagerBloc;
@@ -23,7 +20,8 @@ class SharedPieChart extends StatefulWidget {
} }
class _SharedPieChartState extends State<SharedPieChart> { class _SharedPieChartState extends State<SharedPieChart> {
int lastTouchedIndex = -1; int lastTouchedIndex = 1000;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
TextStyle titleStyle = const TextStyle( TextStyle titleStyle = const TextStyle(
@@ -31,17 +29,33 @@ class _SharedPieChartState extends State<SharedPieChart> {
fontSize: 20, fontSize: 20,
fontWeight: FontWeight.bold, fontWeight: FontWeight.bold,
); );
int offlineCount = List<Map<String, dynamic>> states = [
widget.deviceByState[ApplicationConstants.OFFLINE_STATE]?.length ?? 0; {
int normalCount = 'count': widget.deviceByState[ApplicationConstants.OFFLINE_STATE]?.length ?? 0,
widget.deviceByState[ApplicationConstants.NORMAL_STATE]?.length ?? 0; 'color': Colors.grey
int warningCount = },
widget.deviceByState[ApplicationConstants.WARNING_STATE]?.length ?? 0; {
int inProgressCount = 'count': widget.deviceByState[ApplicationConstants.NORMAL_STATE]?.length ?? 0,
widget.deviceByState[ApplicationConstants.INPROGRESS_STATE]?.length ?? 'color': Colors.green
0; },
int errorCount = {
widget.deviceByState[ApplicationConstants.ERROR_STATE]?.length ?? 0; 'count': widget.deviceByState[ApplicationConstants.WARNING_STATE]?.length ?? 0,
'color': Colors.red
},
{
'count': widget.deviceByState[ApplicationConstants.INPROGRESS_STATE]?.length ?? 0,
'color': Colors.yellow
},
{
'count': widget.deviceByState[ApplicationConstants.ERROR_STATE]?.length ?? 0,
'color': Colors.black
},
];
int offlineCount = widget.deviceByState[ApplicationConstants.OFFLINE_STATE]?.length ?? 0;
int normalCount = widget.deviceByState[ApplicationConstants.NORMAL_STATE]?.length ?? 0;
int warningCount = widget.deviceByState[ApplicationConstants.WARNING_STATE]?.length ?? 0;
int inProgressCount = widget.deviceByState[ApplicationConstants.INPROGRESS_STATE]?.length ?? 0;
int errorCount = widget.deviceByState[ApplicationConstants.ERROR_STATE]?.length ?? 0;
return AspectRatio( return AspectRatio(
aspectRatio: 1.5, aspectRatio: 1.5,
child: Row( child: Row(
@@ -54,55 +68,28 @@ class _SharedPieChartState extends State<SharedPieChart> {
aspectRatio: 1, aspectRatio: 1,
child: PieChart( child: PieChart(
PieChartData( PieChartData(
// pieTouchData: PieTouchData( pieTouchData: PieTouchData(
// touchCallback: (FlTouchEvent event, pieTouchResponse) { enabled: true,
// if (!event.isInterestedForInteractions || touchCallback: (FlTouchEvent event, pieTouchResponse) {
// pieTouchResponse == null || if (!event.isInterestedForInteractions ||
// pieTouchResponse.touchedSection == null) { pieTouchResponse == null ||
// return; pieTouchResponse.touchedSection == null) {
// } return;
// int newTouchedIndex = }
// pieTouchResponse.touchedSection!.touchedSectionIndex; int newTouchedIndex = pieTouchResponse.touchedSection!.touchedSectionIndex;
// updateDevicesOnTapPieChart(newTouchedIndex); updateDevicesOnTapPieChart(newTouchedIndex,states);
// }, },
// ), ),
sections: [ sections: states
PieChartSectionData( .where((state) => state['count'] != 0)
color: Colors.grey, .map((state) => PieChartSectionData(
value: offlineCount.toDouble(), color: state['color'],
title: offlineCount.toString(), value: (state['count'] as int).toDouble(),
radius: context.dynamicWidth(0.2), title: state['count'].toString(),
titleStyle: titleStyle, radius: context.dynamicWidth(0.2),
), titleStyle: titleStyle,
PieChartSectionData( ))
color: Colors.green, .toList(),
value: normalCount.toDouble(),
title: normalCount.toString(),
radius: context.dynamicWidth(0.2),
titleStyle: titleStyle,
),
PieChartSectionData(
color: Colors.red,
value: warningCount.toDouble(),
title: warningCount.toString(),
radius: context.dynamicWidth(0.2),
titleStyle: titleStyle,
),
PieChartSectionData(
color: Colors.yellow,
value: inProgressCount.toDouble(),
title: inProgressCount.toString(),
radius: context.dynamicWidth(0.2),
titleStyle: titleStyle,
),
PieChartSectionData(
color: Colors.black,
value: errorCount.toDouble(),
title: errorCount.toString(),
radius: context.dynamicWidth(0.2),
titleStyle: titleStyle,
),
],
centerSpaceRadius: context.dynamicWidth(0.05), centerSpaceRadius: context.dynamicWidth(0.05),
sectionsSpace: 2, sectionsSpace: 2,
), ),
@@ -181,22 +168,41 @@ class _SharedPieChartState extends State<SharedPieChart> {
); );
} }
void updateDevicesOnTapPieChart(int touchedIndex) { void updateDevicesOnTapPieChart(int touchedIndex, List<Map<String, dynamic>> states) {
if (touchedIndex != lastTouchedIndex) { final filteredStates = states.where((state) => state['count'] != 0).toList();
log("Update PieChart On Tap Function");
lastTouchedIndex = touchedIndex; if (touchedIndex >= 0 && touchedIndex < filteredStates.length) {
if (touchedIndex == 0) { final originalIndex = states.indexOf(filteredStates[touchedIndex]);
widget.devicesManagerBloc.getDeviceByState(-1);
} else if (touchedIndex == 1) { if (originalIndex != lastTouchedIndex) {
widget.devicesManagerBloc.getDeviceByState(0); lastTouchedIndex = originalIndex;
} else if (touchedIndex == 2) { log("Update PieChart On Tap Function");
widget.devicesManagerBloc.getDeviceByState(1); log("Touched Index: $touchedIndex, Original Index: $originalIndex");
} else if (touchedIndex == 3) {
widget.devicesManagerBloc.getDeviceByState(2); switch (originalIndex) {
} else { case 0: // OFFLINE_STATE
widget.devicesManagerBloc.getDeviceByState(-2); log("Touched Index device state = -1");
widget.devicesManagerBloc.getDeviceByState(-1);
break;
case 1: // NORMAL_STATE
log("Touched Index Get device state = 0");
widget.devicesManagerBloc.getDeviceByState(0);
break;
case 2: // WARNING_STATE
log("Touched Index Get device state = 1");
widget.devicesManagerBloc.getDeviceByState(1);
break;
case 3: // INPROGRESS_STATE
log("Touched Index Get device state = 2");
widget.devicesManagerBloc.getDeviceByState(2);
break;
case 4: // ERROR_STATE
log("Touched Index Get device state = 3");
widget.devicesManagerBloc.getDeviceByState(3);
break;
}
} }
} else {} }
} }
} }
@@ -209,6 +215,7 @@ class Indicator extends StatelessWidget {
this.size = 16, this.size = 16,
this.textColor, this.textColor,
}); });
final Color color; final Color color;
final String text; final String text;
final bool isSquare; final bool isSquare;