diff --git a/.vscode/settings.json b/.vscode/settings.json index be44b5af..68491eeb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,7 @@ { - "diffEditor.codeLens": true, - "editor.tabCompletion": "on", - "discord.enabled": true, - "cmake.configureOnOpen": false, - "java.configuration.updateBuildConfiguration": "automatic" -} \ No newline at end of file + "diffEditor.codeLens": true, + "editor.tabCompletion": "on", + "discord.enabled": true, + "cmake.configureOnOpen": false, + "java.configuration.updateBuildConfiguration": "automatic" +} diff --git a/lib/pages/team_lookup/team_lookup.dart b/lib/pages/team_lookup/team_lookup.dart index 2d6dc7b1..9cf6e586 100644 --- a/lib/pages/team_lookup/team_lookup.dart +++ b/lib/pages/team_lookup/team_lookup.dart @@ -8,6 +8,7 @@ import 'package:scouting_dashboard_app/pages/team_lookup/edit_team_lookup_flag.d import 'package:scouting_dashboard_app/pages/team_lookup/tabs/team_lookup_breakdowns.dart'; import 'package:scouting_dashboard_app/pages/team_lookup/tabs/team_lookup_categories.dart'; import 'package:scouting_dashboard_app/pages/team_lookup/tabs/team_lookup_notes.dart'; +import 'package:scouting_dashboard_app/reusable/debouncer.dart'; import 'package:scouting_dashboard_app/reusable/flag_models.dart'; import 'package:scouting_dashboard_app/reusable/page_body.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -22,6 +23,7 @@ class TeamLookupPage extends StatefulWidget { } class _TeamLookupPageState extends State { + final debouncer = Debouncer(delay: const Duration(milliseconds: 200)); String teamFieldValue = ""; TextEditingController? teamFieldController; int? teamNumberForAnalysis; @@ -70,12 +72,16 @@ class _TeamLookupPageState extends State { ), keyboardType: TextInputType.number, onChanged: (value) { - setState(() { - teamFieldValue = value; - if (int.tryParse(value) != null) { - teamNumberForAnalysis = int.parse(value); - } - updateIncrement++; + debouncer.run(() { + setState(() { + teamFieldValue = value; + if (int.tryParse(value) != null) { + teamNumberForAnalysis = int.parse(value); + } else { + teamNumberForAnalysis = null; + } + updateIncrement++; + }); }); }, controller: teamFieldController, @@ -201,15 +207,18 @@ class _TeamLookupFlagState extends State { Widget build(BuildContext context) { if (loadingTeam != widget.team) load(); - return prefs == null || int.tryParse(widget.team) == null - ? Container() - : NetworkFlag( - team: int.parse(widget.team), - flag: FlagConfiguration.fromJson( - jsonDecode( - prefs!.getString('team_lookup_flag')!, - ), - ), - ); + if (prefs == null || + int.tryParse(widget.team) == null || + prefs!.getString('team_lookup_flag') == null) { + return Container(); + } + return NetworkFlag( + team: int.parse(widget.team), + flag: FlagConfiguration.fromJson( + jsonDecode( + prefs!.getString('team_lookup_flag')!, + ), + ), + ); } } diff --git a/lib/reusable/debouncer.dart b/lib/reusable/debouncer.dart new file mode 100644 index 00000000..2fa08553 --- /dev/null +++ b/lib/reusable/debouncer.dart @@ -0,0 +1,20 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; + +class Debouncer { + final Duration delay; + Timer? _timer; + + Debouncer({required this.delay}); + + void run(VoidCallback action) { + _timer?.cancel(); + _timer = Timer(delay, action); + } + + void dispose() { + _timer?.cancel(); + _timer = null; + } +}