part of 'traction.dart'; extension _TractionPersistence on _TractionPageState { Future _restoreSearchState() async { if (widget.selectionMode) return; if (_restoredFromPrefs) return; _restoredFromPrefs = true; try { final prefs = await SharedPreferences.getInstance(); final raw = prefs.getString(_kTractionSearchPrefsKey); if (raw == null || raw.trim().isEmpty) return; final decoded = jsonDecode(raw); if (decoded is! Map) return; final classText = decoded['classText']?.toString(); final numberText = decoded['number']?.toString(); final nameText = decoded['name']?.toString(); final selectedClass = decoded['selectedClass']?.toString(); final mileageFirst = decoded['mileageFirst']; final showAdvanced = decoded['showAdvancedFilters']; if (classText != null) _classController.text = classText; if (numberText != null) _numberController.text = numberText; if (nameText != null) _nameController.text = nameText; final dynamicValues = {}; final enumValues = {}; final dynamicRaw = decoded['dynamic']; if (dynamicRaw is Map) { for (final entry in dynamicRaw.entries) { final key = entry.key.toString(); final val = entry.value?.toString() ?? ''; dynamicValues[key] = val; } } final enumRaw = decoded['enum']; if (enumRaw is Map) { for (final entry in enumRaw.entries) { enumValues[entry.key.toString()] = entry.value?.toString(); } } for (final entry in dynamicValues.entries) { _dynamicControllers.putIfAbsent( entry.key, () => TextEditingController(text: entry.value), ); _dynamicControllers[entry.key]?.text = entry.value; } for (final entry in enumValues.entries) { _enumSelections[entry.key] = entry.value; } if (!mounted) return; _setState(() { _selectedClass = (selectedClass != null && selectedClass.trim().isNotEmpty) ? selectedClass : null; if (mileageFirst is bool) _mileageFirst = mileageFirst; if (showAdvanced is bool) _showAdvancedFilters = showAdvanced; }); } catch (_) { // Ignore preference restore failures. } } Future _persistSearchState() async { if (widget.selectionMode) return; final payload = { 'classText': _classController.text, 'number': _numberController.text, 'name': _nameController.text, 'selectedClass': _selectedClass, 'mileageFirst': _mileageFirst, 'showAdvancedFilters': _showAdvancedFilters, 'dynamic': _dynamicControllers.map((k, v) => MapEntry(k, v.text)), 'enum': _enumSelections, }; try { final prefs = await SharedPreferences.getInstance(); await prefs.setString(_kTractionSearchPrefsKey, jsonEncode(payload)); } catch (_) { // Ignore persistence failures. } } }