stateUpdated method
When you call updateState, this method will be called within your
State. The data parameter will contain any data passed from the
updateState method.
E.g. updateState('my_state', data: "Hello World");
stateUpdated(dynamic data) { data = "Hello World" }
Implementation
Future<void> stateUpdated(dynamic data) async {
if (data is! Map) return;
if (!data.containsKey('action') || data['action'] == null) return;
dynamic stateData = {};
if (data['data'] != null) {
stateData = data['data'];
}
switch (data['action']) {
case 'refresh-page':
{
Function()? setStateData = stateData['setState'];
if (setStateData != null) {
setStateData();
if (mounted) setState(() {});
return;
}
reboot();
break;
}
case 'pop':
{
dynamic result = stateData['result'];
if (result != null) {
pop(result: result);
return;
}
pop();
break;
}
case 'toast-success':
{
showToastSuccess(
title: stateData['title'],
description: stateData['description'],
);
break;
}
case 'toast-warning':
{
showToastWarning(
title: stateData['title'],
description: stateData['description'],
);
break;
}
case 'toast-info':
{
showToastInfo(
title: stateData['title'],
description: stateData['description'],
);
break;
}
case 'toast-oops':
{
showToastInfo(
title: stateData['title'],
description: stateData['description'],
);
break;
}
case 'toast-danger':
{
showToastDanger(
title: stateData['title'],
description: stateData['description'],
);
break;
}
case 'toast-sorry':
{
showToastSorry(
title: stateData['title'],
description: stateData['description'],
);
break;
}
case 'toast-custom':
{
showToastCustom(
title: stateData['title'],
description: stateData['description'],
id: stateData['id'],
);
break;
}
case 'change-language':
{
changeLanguage(
stateData['language'],
restartState: stateData['restartState'],
);
break;
}
case 'lock-release':
{
lockRelease(
stateData['name'],
perform: stateData['perform'],
shouldSetState: stateData['shouldSetState'],
);
break;
}
case 'confirm-action':
{
confirmAction(
stateData['action'],
title: stateData['title'],
dismissText: stateData['dismissText'],
);
break;
}
case 'set-state':
{
Function()? setStateData = stateData['setState'];
if (setStateData != null) {
if (mounted) {
setState(() {
setStateData();
});
}
return;
}
}
case 'validate':
{
Map<String, dynamic> rules = stateData['rules'] ?? {};
Map<String, dynamic>? data = stateData['data'];
Map<String, dynamic>? messages = stateData['messages'];
bool showAlert = stateData['showAlert'] ?? true;
Duration? alertDuration = stateData['alertDuration'];
String alertStyle = stateData['alertStyle'] ?? 'warning';
Function()? onSuccess = stateData['onSuccess'];
Function(Exception)? onFailure = stateData['onFailure'];
String? lockReleaseName = stateData['lockRelease'];
Future<void> performValidation() async {
List<String> errors = [];
for (var entry in rules.entries) {
String field = entry.key;
dynamic rule = entry.value;
dynamic value = data?[field];
if (rule is FormValidator) {
rule.setData(value);
FormValidationResult result = rule.check();
if (!result.isValid) {
String? customMessage = messages?[field];
errors.add(
customMessage ??
result.getFirstErrorMessage() ??
'Validation failed for $field',
);
}
} else if (rule is String) {
// Handle simple string rules like "required", "email", etc.
if (rule.contains('required') &&
(value == null || value.toString().isEmpty)) {
String? customMessage = messages?[field];
errors.add(customMessage ?? '$field is required');
}
}
}
if (errors.isNotEmpty) {
if (showAlert) {
String errorMessage = errors.first;
showToast(
id: alertStyle,
description: errorMessage,
duration: alertDuration,
);
}
if (onFailure != null) {
onFailure(Exception(errors.join(', ')));
}
} else {
if (onSuccess != null) {
onSuccess();
}
}
}
if (lockReleaseName != null) {
lockRelease(lockReleaseName, perform: performValidation);
} else {
await performValidation();
}
break;
}
default:
{}
}
}