В итоге я решил эту проблему, изначально отклонив новое изменение и сохранив значение позже, чтобы использовать его, если пользователь передал биометрические данные. Если пользователь потерпел неудачу, ничего не должно было произойти, потому что я изначально отклонил изменение. Но если бы пользователь передал обратный вызов, я бы внес изменения. Хотя это кажется единственным логическим вариантом для SwitchPreference, это не было очевидно при выполнении ListPreference.
В моей конкретной реализации c я добавил onPreferenceChangeListener
findPreference<Preference>(BIOMETRIC_OPTION_KEY)?.setOnPreferenceChangeListener { preference, newValue ->
if (newValue is String) {
performBiometricFlow(preference.key, newValue)
}
false
}
performBiometricFlow с именем диалоговое окно биометрических данных библиотека , а в обратном вызове я запустил функцию, которая определяла, что нажимается (на основе ключа), и запускала соответствующую функцию. В этом случае было выбрано диалоговое окно параметров biometri c, и если оно прошло, оно запустило бы это
private fun changeBiometricPreference(newValue: String) {
findPreference<ListPreference>(BIOMETRIC_OPTION_KEY)?.value = newValue
}
. Эта часть сохраняет новое значение, которое изначально предполагалось сохранить, путем нахождения ListPreference и его переназначения. .