compareActiveNames function
Compares the current activeNames list with the prevActiveNames list and triggers an action if there are any differences.
The function updates prevActiveNames after the comparison to keep track of changes.
This function performs the following steps:
- If the
restartflag is true, it triggers the action without comparison. - If
restartis false, it compares each name inactiveNamesto check if any name is new or removed compared toprevActiveNames. - If a change is detected, it calls the
triggerfunction with the updatedactiveNames. - Finally, it updates
prevActiveNamesto reflect the currentactiveNames.
Parameters:
options(CompareActiveNamesOptions): Configuration options for comparing active names:restart(bool): When true, triggers an action immediately without comparison.parameters(CompareActiveNamesParameters): Provides the lists ofactiveNamesandprevActiveNames, as well as functions to updateprevActiveNamesand trigger actions when changes are detected.
Returns:
A Future<void> that completes when the comparison and possible trigger actions are finished.
Example:
final options = CompareActiveNamesOptions(
restart: false,
parameters: MyCompareActiveNamesParameters(
activeNames: ['Alice', 'Bob'],
prevActiveNames: ['Alice'],
updatePrevActiveNames: (prevNames) => print('Previous names updated to: $prevNames'),
trigger: (TriggerOptions options) => print('Triggered action with ${options.refActiveNames}'),
),
);
compareActiveNames(options).then((_) {
print('Active names comparison completed successfully.');
});
Error Handling:
If an error occurs, it is caught and logged in debug mode without throwing further.
Implementation
Future<void> compareActiveNames(CompareActiveNamesOptions options) async {
var parameters = options.parameters.getUpdatedAllParams();
// Extract parameters
List<String> activeNames = parameters.activeNames;
List<String> prevActiveNames = parameters.prevActiveNames;
var updatePrevActiveNames = parameters.updatePrevActiveNames;
var trigger = parameters.trigger;
try {
// Restart the comparison if needed
if (options.restart) {
final optionsTrigger = TriggerOptions(
parameters: parameters,
refActiveNames: activeNames,
);
trigger(optionsTrigger);
return;
}
// Track changes in activeNames
List<bool> nameChanged = [];
// Compare each name in activeNames
for (final currentName in activeNames) {
// Check if the name is present in prevActiveNames
final hasNameChanged = !prevActiveNames.contains(currentName);
if (hasNameChanged) {
nameChanged.add(true);
final optionsTrigger = TriggerOptions(
parameters: parameters,
refActiveNames: activeNames,
);
trigger(optionsTrigger);
break;
}
}
// Count occurrences of true in nameChanged
final count = nameChanged.where((value) => value).length;
if (count < 1) {
// Check for new names in prevActiveNames
for (final currentName in prevActiveNames) {
final hasNameChanged = !activeNames.contains(currentName);
if (hasNameChanged) {
final optionsTrigger = TriggerOptions(
parameters: parameters,
refActiveNames: activeNames,
);
trigger(optionsTrigger);
break;
}
}
}
// Update prevActiveNames with current activeNames
updatePrevActiveNames(List<String>.from(activeNames));
} catch (error) {
if (kDebugMode) {
print('compareActiveNames error: $error');
}
}
}