From 408c92d8437660831244f890a664e87a1d1a9d98 Mon Sep 17 00:00:00 2001 From: anhtunz Date: Mon, 13 Jan 2025 10:11:26 +0700 Subject: [PATCH] fix(bugs): prevent redundant API calls on PieChart interaction in DeviceManagerPage --- lib/feature/bell/bell_screen.dart | 1 - .../devices/devices_manager_screen.dart | 10 ++- lib/feature/settings/settings_screen.dart | 7 +- lib/main.dart | 2 +- lib/product/shared/shared_pie_chart.dart | 76 ++++++++----------- 5 files changed, 44 insertions(+), 52 deletions(-) diff --git a/lib/feature/bell/bell_screen.dart b/lib/feature/bell/bell_screen.dart index ba96a43..5898ed3 100644 --- a/lib/feature/bell/bell_screen.dart +++ b/lib/feature/bell/bell_screen.dart @@ -3,7 +3,6 @@ import 'dart:async'; import 'package:flutter/material.dart'; import '../../product/extention/context_extention.dart'; import '../../product/services/language_services.dart'; -import '../../product/constant/enums/app_theme_enums.dart'; import '../../bloc/bell_bloc.dart'; import '../../product/base/bloc/base_bloc.dart'; import '../../product/services/api_services.dart'; diff --git a/lib/feature/devices/devices_manager_screen.dart b/lib/feature/devices/devices_manager_screen.dart index 64aa869..a3b35d5 100644 --- a/lib/feature/devices/devices_manager_screen.dart +++ b/lib/feature/devices/devices_manager_screen.dart @@ -30,6 +30,7 @@ class _DevicesManagerScreenState extends State { List devices = []; Timer? getAllDevicesTimer; List tags = []; + int tagIndex = -2; @override void initState() { super.initState(); @@ -38,7 +39,7 @@ class _DevicesManagerScreenState extends State { const duration = Duration(seconds: 10); getAllDevicesTimer = Timer.periodic( duration, - (Timer t) => devicesManagerBloc.getDeviceByState(-2), + (Timer t) => devicesManagerBloc.getDeviceByState(tagIndex), ); } @@ -65,7 +66,10 @@ class _DevicesManagerScreenState extends State { .getDeviceByState(tagSnapshot.data?[0] ?? -2); return const Center(child: CircularProgressIndicator()); } else { - if (tagSnapshot.data!.isNotEmpty) {} + if (tagSnapshot.data!.isNotEmpty) { + tagIndex = tagSnapshot.data![0]; + devicesManagerBloc.sinkTagStates.add([tagIndex]); + } return SingleChildScrollView( child: Column( children: [ @@ -154,7 +158,7 @@ class _DevicesManagerScreenState extends State { // log('Chuyen page: $pageIndex'); }, rowsPerPage: - (allDeviceSnapshot.data?.length ?? 0) < 6 + (allDeviceSnapshot.data?.length ?? 1) < 6 ? (allDeviceSnapshot.data?.length ?? 0) : 5, diff --git a/lib/feature/settings/settings_screen.dart b/lib/feature/settings/settings_screen.dart index 0e44c4b..853c40a 100644 --- a/lib/feature/settings/settings_screen.dart +++ b/lib/feature/settings/settings_screen.dart @@ -52,8 +52,10 @@ class _SettingsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.center, children: [ CircleAvatar( + backgroundColor: Theme.of(context).focusColor, radius: 70, child: CircleAvatar( + backgroundColor: Theme.of(context).highlightColor, radius: 60, child: CircleAvatar( radius: 50, @@ -61,7 +63,9 @@ class _SettingsScreenState extends State { getAvatarContent( userSnapshot.data?.username ?? ""), style: const TextStyle( - fontSize: 35, fontWeight: FontWeight.bold), + fontSize: 35, + fontWeight: FontWeight.bold, + ), ), ), ), @@ -121,6 +125,7 @@ class _SettingsScreenState extends State { } }, child: Card( + color: Theme.of(context).colorScheme.onInverseSurface, margin: const EdgeInsets.only(left: 35, right: 35, bottom: 10), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(30)), child: ListTile( diff --git a/lib/main.dart b/lib/main.dart index 41b104b..64425fb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,11 @@ import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'product/services/theme_services.dart'; import 'product/services/language_services.dart'; import 'bloc/main_bloc.dart'; import 'product/base/bloc/base_bloc.dart'; import 'product/constant/navigation/navigation_router.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); diff --git a/lib/product/shared/shared_pie_chart.dart b/lib/product/shared/shared_pie_chart.dart index d0184d6..92a5d35 100644 --- a/lib/product/shared/shared_pie_chart.dart +++ b/lib/product/shared/shared_pie_chart.dart @@ -9,7 +9,7 @@ import 'package:sfm_app/product/services/language_services.dart'; import '../constant/app/app_constants.dart'; -class SharedPieChart extends StatelessWidget { +class SharedPieChart extends StatefulWidget { const SharedPieChart( {super.key, required this.deviceByState, @@ -18,24 +18,32 @@ class SharedPieChart extends StatelessWidget { final Map> deviceByState; final DevicesManagerBloc devicesManagerBloc; + @override + State createState() => _SharedPieChartState(); +} + +class _SharedPieChartState extends State { + int lastTouchedIndex = -1; @override Widget build(BuildContext context) { int touchedIndex = -1; + TextStyle titleStyle = const TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold, ); int offlineCount = - deviceByState[ApplicationConstants.OFFLINE_STATE]?.length ?? 0; + widget.deviceByState[ApplicationConstants.OFFLINE_STATE]?.length ?? 0; int normalCount = - deviceByState[ApplicationConstants.NORMAL_STATE]?.length ?? 0; + widget.deviceByState[ApplicationConstants.NORMAL_STATE]?.length ?? 0; int warningCount = - deviceByState[ApplicationConstants.WARNING_STATE]?.length ?? 0; + widget.deviceByState[ApplicationConstants.WARNING_STATE]?.length ?? 0; int inProgressCount = - deviceByState[ApplicationConstants.INPROGRESS_STATE]?.length ?? 0; + widget.deviceByState[ApplicationConstants.INPROGRESS_STATE]?.length ?? + 0; int errorCount = - deviceByState[ApplicationConstants.ERROR_STATE]?.length ?? 0; + widget.deviceByState[ApplicationConstants.ERROR_STATE]?.length ?? 0; return AspectRatio( aspectRatio: 1.5, child: Row( @@ -58,34 +66,7 @@ class SharedPieChart extends StatelessWidget { } int newTouchedIndex = pieTouchResponse.touchedSection!.touchedSectionIndex; - - // Chỉ gọi updateDevicesOnTapPieChart nếu touchedIndex thay đổi - if (newTouchedIndex != touchedIndex) { - touchedIndex = newTouchedIndex; - log("TouchedIndex: $touchedIndex"); - log("Event: ${event.isInterestedForInteractions}"); - - Future.delayed( - context.lowDuration, - () => updateDevicesOnTapPieChart(newTouchedIndex), - ); - } - // touchedIndex = - // pieTouchResponse.touchedSection!.touchedSectionIndex; - // // log("TouchedIndex: $touchedIndex"); - // // log("Event: ${event.isInterestedForInteractions}"); - // // int currentTouchedIndex = touchedIndex; - - // if (currentTouchedIndex != touchedIndex) { - // touchedIndex = currentTouchedIndex; - // log("TouchedIndex: $touchedIndex"); - // log("Event: ${event.isInterestedForInteractions}"); - - // Future.delayed( - // context.lowDuration, - // () => updateDevicesOnTapPieChart(touchedIndex), - // ); - // } + updateDevicesOnTapPieChart(newTouchedIndex); }, ), sections: [ @@ -204,18 +185,21 @@ class SharedPieChart extends StatelessWidget { } void updateDevicesOnTapPieChart(int touchedIndex) { - log("Update PieChart On Tap Function"); - if (touchedIndex == 0) { - devicesManagerBloc.getDeviceByState(-1); - } else if (touchedIndex == 1) { - devicesManagerBloc.getDeviceByState(0); - } else if (touchedIndex == 2) { - devicesManagerBloc.getDeviceByState(1); - } else if (touchedIndex == 3) { - devicesManagerBloc.getDeviceByState(2); - } else { - devicesManagerBloc.getDeviceByState(-2); - } + if (touchedIndex != lastTouchedIndex) { + log("Update PieChart On Tap Function"); + lastTouchedIndex = touchedIndex; + if (touchedIndex == 0) { + widget.devicesManagerBloc.getDeviceByState(-1); + } else if (touchedIndex == 1) { + widget.devicesManagerBloc.getDeviceByState(0); + } else if (touchedIndex == 2) { + widget.devicesManagerBloc.getDeviceByState(1); + } else if (touchedIndex == 3) { + widget.devicesManagerBloc.getDeviceByState(2); + } else { + widget.devicesManagerBloc.getDeviceByState(-2); + } + } else {} } }