如何解决将 lateinit var 设置为 null 不起作用 - 但在 Googles 文档中的示例
所以我想在我的 android 应用程序中创建一个插页式广告,但他们的例子不起作用(对我来说?)。
他们在那里将值 mIntersitialAd
设置为 null
,但它是一个 lateinit var
,所以应该不可能。我在那里遗漏了什么,还是真的有可能?
文档链接:
代码示例:
import com.google.android.gms.ads.interstitial.InterstitialAd;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
class MainActivity : AppCompatActivity() {
private lateinit var mInterstitialAd:InterstitialAd
private final var TAG = 'MainActivity'
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var adRequest = AdRequest.Builder().build()
InterstitialAd.load(this,"ca-app-pub-3940256099942544/1033173712",adRequest,object : InterstitialAdLoadCallback() {
override fun onAdFailedToLoad(adError: LoadAdError) {
Log.d(TAG,adError?.message);
mInterstitialAd = null
}
override fun onAdLoaded(interstitialAd: InterstitialAd) {
Log.d(TAG,'Ad was loaded.');
mInterstitialAd = interstitialAd
}
})
}
}
以及 mIntersitialAd 的使用:
mInterstitialAd.fullScreenContentCallback = object: FullScreenContentCallback() {
override fun onAdDismissedFullScreenContent() {
Log.d(TAG,'Ad was dismissed.');
}
override fun onAdFailedToShowFullScreenContent(adError: AdError?) {
Log.d(TAG,'Ad failed to show.');
}
override fun onAdShowedFullScreenContent() {
Log.d(TAG,'Ad showed fullscreen content.');
mInterstitialAd = null;
}
}
解决方法
正如@a_local_nobody 提到的,在这种情况下,我们只能删除 lateinit
,并将其设为 nullable
并使用带有 elvis
的实例
private var mInterstitialAd: InterstitialAd? = null
访问它时只需使用 ?.
,这样您就可以将其设置为 null
mInterstitialAd?.fullScreenContentCallback = //...
,
似乎文档中的一个错误,如果使用 lateinit
声明该变量,则无法将该变量设置为等于 null
private lateinit var foo: String?
这也不是有效代码,因为 lateinit
不能用于可空变量
关于 lateinit here 的文档
通常,声明为非空类型的属性必须是 在构造函数中初始化。然而,通常情况并非如此 方便的。例如,属性可以通过初始化 依赖注入,或在单元测试的设置方法中。在这 在这种情况下,您不能在构造函数中提供非空的初始化程序,但是 您仍然希望在引用属性时避免空检查 在类的主体内。
修饰符可用于声明在主体内部的 var 属性 一个类(不在主构造函数中,并且仅当属性 没有自定义的 getter 或 setter)以及顶级 属性和局部变量。 属性或变量的类型 必须非空,并且不能是原始类型。
对于任何对替代解决方案感兴趣的人,请查看@rajan.kali here
提供的答案版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。