89 lines
3.0 KiB
Dart
89 lines
3.0 KiB
Dart
part of 'traction.dart';
|
|
|
|
extension _TractionPersistence on _TractionPageState {
|
|
Future<void> _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 = <String, String>{};
|
|
final enumValues = <String, String?>{};
|
|
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<void> _persistSearchState() async {
|
|
if (widget.selectionMode) return;
|
|
final payload = <String, dynamic>{
|
|
'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.
|
|
}
|
|
}
|
|
}
|