从片段调用类的方法时遇到问题

问题描述

我这里有2个课程:

#1 AlarmReceiver

class AlarmReceiver: broadcastReceiver() {
...
fun setRepeatingalarm(context: Context) {} //the method that i want to call
}

#2 SettingFragment(附加到SettingActivity)

SettingFragment(): PreferencefragmentCompat() {
private lateinit var reminder: String
private lateinit var language: String

private lateinit var alarmReceiver: AlarmReceiver

private lateinit var langPreference: Preference
private lateinit var reminderPreference: SwitchPreference
override fun onCreatePreferences(savedInstanceState: Bundle?,s: String?) {
    addPreferencesFromresource(R.xml.settings)
    init()

}
private fun init() {
    reminder = resources.getString(R.string.key_reminder)
    language = resources.getString(R.string.key_language)
    alarmReceiver = AlarmReceiver()


    langPreference = findPreference<Preference> (language) as Preference
    reminderPreference = findPreference<SwitchPreference> (reminder) as SwitchPreference
}
private fun reminderSetting() {
    // the method where i place the that method
}

我对如何从我调用方法定义上下文参数感到困惑。 我试图对此进行编码:

alarmReceiver.setRepeatingalarm(activity.applicationContext)

但是我收到错误消息“ 在FragmentActivity类型的可为空的接收器上仅允许安全(?。)或非空断言(!!。)调用” 如何解决这个问题呢?谢谢:)

解决方法

activity属性实际上是在调用Fragment的{​​{1}}方法,该方法可以返回null-片段可能处于创建状态,但不是。 t实际上实际上尚未附加到getActivity()上,因此在这种情况下,此方法将返回Activity

您正在将另一个调用链接到结果,所以由于它可能为空,因此您正在调用null(好!)或Activity.applicationContext(很差!)。因此,警告提示您正在执行此操作,您要么需要安全地处理该潜在的null(使用null.applicationContext调用),要么明确地说“当我调用它时,它肯定不会为null”(与?.通话)

您应该阅读Kotlin's null safety handling,因为它很重要,并且可以使您的生活终极轻松。但是在这种情况下(大多数情况下),您不应该使用!!.,因为在某些情况下,该字段将不为true,该属性将为null,然后您的应用程序崩溃

这是处理它的安全方法:

!!

您可以使用多种方法来编写代码,但这是最简单的理解-如果activity?.let { alarmReceiver.setRepeatingAlarm(it.applicationContext) } 不为null,它将运行activity块,并传递非null {{1 }}作为变量let。然后,您可以以相同的方式运行代码,因为现在您知道它不为空!如果activity 为空,则该it块将根本不会运行。您的闹钟不会设置,但如果您的应用程序崩溃了,也不会设置-您可以通过这种方式进行处理,或者在极少数情况下永远都不会发生,您什么也不能做-它是绝对不会因为activity而崩溃!