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注释,我将该类添加到清单中