Android 即使在删除侦听器之后,客户端也没有执行此操作错误的权限

Android 即使在删除侦听器之后,客户端也没有执行此操作错误的权限,android,firebase,kotlin,firebase-realtime-database,firebase-authentication,Android,Firebase,Kotlin,Firebase Realtime Database,Firebase Authentication,我正在我的应用程序中使用Firebase身份验证,我的设置活动中有以下代码,允许用户注销并返回登录活动: val logOutPreference: Preference = findPreference("logout_preference")!! logOutPreference.onPreferenceClickListener = Preference.OnPreferenceClickListener { userInfo.removeEve

我正在我的应用程序中使用Firebase身份验证,我的
设置活动
中有以下代码,允许用户注销并返回
登录活动

val logOutPreference: Preference = findPreference("logout_preference")!!
logOutPreference.onPreferenceClickListener =
    Preference.OnPreferenceClickListener {
        userInfo.removeEventListener(listener)
        auth.signOut()
        val intent = Intent(this@SettingsFragment.context, LoginActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
        startActivity(intent)
        true
    }
userInfo = database.getReference("users").child(auth.currentUser!!.uid)
listener = userInfo.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (postSnapshot in dataSnapshot.children) {
            if (postSnapshot.key == "firstName") {
                firstNamePreference.text = postSnapshot.getValue(String::class.java)
            } else if (postSnapshot.key == "lastName") {
                lastNamePreference.text = postSnapshot.getValue(String::class.java)
            } else if (postSnapshot.key == "username") {
                userNamePreference.title =
                    "Username: ${postSnapshot.getValue(String::class.java)}"
            }
        }
    }

    override fun onCancelled(databaseError: DatabaseError) {
        Toast.makeText(
            context, databaseError.message,
            Toast.LENGTH_LONG
        ).show()
    }
})
我在我的
设置活动中使用Firebase实时数据库

val logOutPreference: Preference = findPreference("logout_preference")!!
logOutPreference.onPreferenceClickListener =
    Preference.OnPreferenceClickListener {
        userInfo.removeEventListener(listener)
        auth.signOut()
        val intent = Intent(this@SettingsFragment.context, LoginActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
        startActivity(intent)
        true
    }
userInfo = database.getReference("users").child(auth.currentUser!!.uid)
listener = userInfo.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (postSnapshot in dataSnapshot.children) {
            if (postSnapshot.key == "firstName") {
                firstNamePreference.text = postSnapshot.getValue(String::class.java)
            } else if (postSnapshot.key == "lastName") {
                lastNamePreference.text = postSnapshot.getValue(String::class.java)
            } else if (postSnapshot.key == "username") {
                userNamePreference.title =
                    "Username: ${postSnapshot.getValue(String::class.java)}"
            }
        }
    }

    override fun onCancelled(databaseError: DatabaseError) {
        Toast.makeText(
            context, databaseError.message,
            Toast.LENGTH_LONG
        ).show()
    }
})
代码成功地注销了用户,但我得到的祝酒词是
客户端没有执行此操作的权限
。为什么我要吃烤面包?我在注销用户之前删除了侦听器,因此我不明白为什么仍然会出现此错误

下面是
设置活动的完整代码。我之所以包含此内容,是因为我不知道是否需要删除另一个侦听器来修复此错误:

class SettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)
        supportFragmentManager
            .beginTransaction()
            .replace(R.id.settings, SettingsFragment())
            .commit()
    }

    class SettingsFragment : PreferenceFragmentCompat() {
        private lateinit var auth: FirebaseAuth
        private lateinit var database: FirebaseDatabase
        private lateinit var userInfo: DatabaseReference
        private lateinit var listener: ValueEventListener

        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey)

            auth = FirebaseAuth.getInstance()
            database = FirebaseDatabase.getInstance()

            val firstNamePreference: EditTextPreference = findPreference("first_name_preference")!!
            val lastNamePreference: EditTextPreference = findPreference("last_name_preference")!!
            val userNamePreference: Preference = findPreference("username_preference")!!
            val notificationsPreference: SwitchPreference = findPreference("notifications_switch_preference")!!
            val logOutPreference: Preference = findPreference("logout_preference")!!
            val deleteAccountPreference: Preference = findPreference("delete_account_preference")!!

            if (notificationsPreference.isChecked) {
                notificationsPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_notifications_active)
            } else {
                notificationsPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_notifications_off)
            }
            
            userInfo = database.getReference("users").child(auth.currentUser!!.uid)
            listener = userInfo.addValueEventListener(object : ValueEventListener {
                override fun onDataChange(dataSnapshot: DataSnapshot) {
                    for (postSnapshot in dataSnapshot.children) {
                        if (postSnapshot.key == "firstName") {
                            firstNamePreference.text = postSnapshot.getValue(String::class.java)
                        } else if (postSnapshot.key == "lastName") {
                            lastNamePreference.text = postSnapshot.getValue(String::class.java)
                        } else if (postSnapshot.key == "username") {
                            userNamePreference.title =
                                "Username: ${postSnapshot.getValue(String::class.java)}"
                        }
                    }
                }

                override fun onCancelled(databaseError: DatabaseError) {
                    Toast.makeText(
                        context, databaseError.message,
                        Toast.LENGTH_LONG
                    ).show()
                }
            })

            firstNamePreference.onPreferenceChangeListener =
                Preference.OnPreferenceChangeListener { preference, newValue ->
                    userInfo.child("firstName").setValue(newValue)
                    false
                }

            lastNamePreference.onPreferenceChangeListener =
                Preference.OnPreferenceChangeListener { preference, newValue ->
                    userInfo.child("lastName").setValue(newValue)
                    false
                }

            notificationsPreference.onPreferenceChangeListener =
                Preference.OnPreferenceChangeListener { preference, newValue ->
                    val switched: Boolean = newValue as? Boolean ?: false
                    if (switched) {
                        notificationsPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_notifications_active)
                    } else {
                        notificationsPreference.icon = ContextCompat.getDrawable(requireContext(), R.drawable.ic_notifications_off)
                    }
                    true
                }

            logOutPreference.onPreferenceClickListener =
                Preference.OnPreferenceClickListener {
                    userInfo.removeEventListener(listener)
                    auth.signOut()
                    val intent = Intent(this@SettingsFragment.context, LoginActivity::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
                    startActivity(intent)
                    true
                }

            deleteAccountPreference.onPreferenceClickListener =
                Preference.OnPreferenceClickListener {
                    userInfo.removeValue()
                    userInfo.removeEventListener(listener)
                    auth.currentUser!!.delete()
                    val intent = Intent(this@SettingsFragment.context, RegisterActivity::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
                    startActivity(intent)
                    true
                }
        }
    }
}