This commit is contained in:
Gaurav Kumar
2025-09-17 10:36:16 +05:30
parent 0805cf44e4
commit 70c992ddb9
3 changed files with 447 additions and 4 deletions

View File

@@ -383,15 +383,14 @@
// }
// }
// }
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../../../core/providers/dynamic_theme_provider.dart';
import '../fields/base_field.dart';
import '../fields/dependent_dropdown_field.dart';
import '../../../shared/widgets/buttons/modern_button.dart';
import '../../../core/constants/ui_constants.dart';
import 'dart:convert';
/// Reusable form component that dynamically renders fields based on field definitions
/// This allows UI to be independent of field types and enables reusability
@@ -419,12 +418,14 @@ class _EntityFormState extends State<EntityForm> {
final _formKey = GlobalKey<FormState>();
final Map<String, TextEditingController> _controllers = {};
final Map<String, BaseField> _fieldByKey = {};
final Map<String, List<DependentDropdownField>> _dependentFields = {};
late final Map<String, dynamic> _initialData;
@override
void initState() {
super.initState();
_initializeControllers();
_setupDependentFields();
}
void _initializeControllers() {
@@ -452,6 +453,37 @@ class _EntityFormState extends State<EntityForm> {
}
}
void _setupDependentFields() {
// Group dependent dropdown fields by their dependent field key
for (final field in widget.fields) {
if (field is DependentDropdownField) {
final dependentFieldKey = field.dependentFieldKey;
if (!_dependentFields.containsKey(dependentFieldKey)) {
_dependentFields[dependentFieldKey] = [];
}
_dependentFields[dependentFieldKey]!.add(field);
}
}
}
void _handleFieldChange(String fieldKey) {
setState(() {});
// Check if this field has dependent dropdowns
if (_dependentFields.containsKey(fieldKey)) {
final dependentFields = _dependentFields[fieldKey]!;
final fieldValue = _controllers[fieldKey]?.text ?? '';
// Clear dependent dropdown values when parent field changes
for (final dependentField in dependentFields) {
_controllers[dependentField.fieldKey]?.clear();
}
// Trigger rebuild to update dependent dropdowns
setState(() {});
}
}
@override
void dispose() {
for (final controller in _controllers.values) {
@@ -482,7 +514,7 @@ class _EntityFormState extends State<EntityForm> {
child: field.buildField(
controller: _controllers[field.fieldKey]!,
colorScheme: colorScheme,
onChanged: () => setState(() {}),
onChanged: () => _handleFieldChange(field.fieldKey),
),
)),