stateUpdated method

Future<void> stateUpdated(
  1. dynamic data
)

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:
      {}
  }
}