Android lateinit属性str尚未初始化
我目前正在学习匕首柄,但我遇到了一个问题:Android lateinit属性str尚未初始化,android,android-studio,kotlin,dependency-injection,dagger-hilt,Android,Android Studio,Kotlin,Dependency Injection,Dagger Hilt,我目前正在学习匕首柄,但我遇到了一个问题: kotlin.UninitializedPropertyAccessException: lateinit property str has not been initialized at com.example.kotlin20test.MainActivity.getStr(MainActivity.kt:24) at com.example.kotlin20test.MainActivity.onCreate(M
kotlin.UninitializedPropertyAccessException: lateinit property str has not been initialized
at com.example.kotlin20test.MainActivity.getStr(MainActivity.kt:24)
at com.example.kotlin20test.MainActivity.onCreate(MainActivity.kt:34)
at android.app.Activity.performCreate(Activity.java:7802)
at android.app.Activity.performCreate(Activity.java:7791)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
这是我的档案:
主要活动:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var str: String
@Inject private lateinit var api: JsonPlaceholderApi
lateinit var mainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(R.layout.activity_main)
if(str != null){
println(str)
}
}}
@Module
@InstallIn(SingletonComponent::class)
object MyModule{
@Provides
fun provideString(): String{
return "Look, It's a string"
}
}
MyModule:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var str: String
@Inject private lateinit var api: JsonPlaceholderApi
lateinit var mainBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(R.layout.activity_main)
if(str != null){
println(str)
}
}}
@Module
@InstallIn(SingletonComponent::class)
object MyModule{
@Provides
fun provideString(): String{
return "Look, It's a string"
}
}
我也尝试过用刀柄进行改装,但它给了我同样的错误,我读过很多关于这个问题的堆栈溢出,并尝试了答案,但似乎没有任何效果
编辑:我忘了添加应用程序类和清单,所以它是:
MyApp
@HiltAndroidApp
class MyApp : Application(){
}
AndroidManifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.kotlin20test">
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Kotlin20Test">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
提前感谢。检查Kotlin lateinit var是否已初始化的正确方法是使用 KProperty值已初始化,将其转换为:
if(str != null){
println(str)
}
为此:
if(::str.isInitialized){
println(str)
}
编辑:正如另一位用户指出的,我错误地包含了一个!最初。虽然您尚未初始化变量,但当您尝试获取该变量时,即使对于
str!=空
正如@VelocityCubeR所说,kotlin有其他方法来检查属性是否已初始化,但他错在了代码>
您必须更改str!=空
到::str.i初始化
匕首柄与此异常无关,这是kotlin的基本语法,嘿,你忘了@Singleton
注释了
@Module
@InstallIn(SingletonComponent::class)
object MyModule{
@Singleton <------ include this
@Provides
fun provideString(): String{
return "Look, It's a string"
}
}
@模块
@InstallIn(SingletonComponent::class)
对象MyModule{
@很遗憾,Singleton没有工作。好吧,我创建了一个新项目,使用相同的代码,但没有lateinit var mainBinding:ActivityMainBinding和mainBinding=ActivityMainBinding.inflate(layoutInflater)它成功了。如果你没有,请试试这个,谢谢我使用了委托和普通的旧findViewById,它仍然打印相同的错误。再次重申,我只想用刀柄将字符串打印到控制台,如果我打扰了你,对不起,兄弟。哈哈,很高兴帮助兄弟,这显然与你的ui绑定方式有关,你的刀柄实现假设是正确的,如果我得到任何进一步的答案,我会在这里发表评论。我这样做了,应用程序运行良好,但问题仍然是没有记录任何内容,当我删除检查时,它仍然会给我相同的错误,顺便提一下,有一个应用程序类用@HiltAndroidApp注释,我将该类添加到清单中