如何使用 Koin 将 class 注入 MainActivity

How to inject class into MainActivity with Koin

我想创建一个启动画面并在确定用户的身份验证状态后显示它。我有一个名为 AuthStateController 的全局 singleton,它保存我的状态和一些额外的功能。
但是因为 installSplashScreen 函数在可组合项之外,所以我无法使用 Koin 注入 AuthStateController class 来访问我的 loading 状态。

下面是我的 MainActivity 和我所有的 Koin 模块。还有 installSplashScreen 函数。

class MainActivity : ComponentActivity() {
    // not allowed because outside of Composable
    private val authStateController: AuthStateController by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        startKoin {
            androidLogger(if (BuildConfig.DEBUG) Level.ERROR else Level.NONE)
            androidContext(this@MainActivity)
            modules(listOf(appModule, networkModule, viewModelModule, interactorsModule))
        }

        installSplashScreen().apply {
            setKeepVisibleCondition {
                // need AuthStateController instance to determine loading state
                authStateController.state.value.isLoading
            }
        }

        setContent {
                M3Theme {
                    SetupNavGraph()
                }
            }
        }
    }
}

这是我的 AuthStateController class:

的 Koin module
val appModule = module {
    single { AuthStateController(get()) }
}

这是我的 AuthStateController class,它包含我的状态和一些额外的功能:

class AuthStateController(
    private val getMeInterceptor: GetMeInterceptor
) {
    val state: MutableState<AuthState> = mutableStateOf(AuthState())

    fun fetchMe() {
        val me = getMeInterceptor.execute().collect(CoroutineScope(Dispatchers.IO)) { dataState ->
            dataState.data?.let {
                state.value =
                    state.value.copy(profile = it, isAuthenticated = true, isLoading = false)
            }
        }
    }

    init {
        val token = settings.getString(Constants.AUTH_TOKEN)
        if (token.isNotBlank()) {
            fetchMe()
            state.value = state.value.copy(authToken = token)
        }
    }
}

如何访问在 MainActivity 中使用 Koin 创建的 singleton 并在 installSplashScreen 函数中使用它?

编辑

Android 清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.sessions_clean.android">

    <uses-permission android:name="android.permission.INTERNET" />
    
    <application
        // app crashes when adding line below
        android:name=".MainApplication"
        android:allowBackup="false"
        android:supportsRtl="true"
        android:theme="@style/Theme.App.Starting"
        android:usesCleartextTraffic="true">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:theme="@style/Theme.App.Starting">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

当我将 android:name 添加到已经存在的应用程序标签时,应用程序立即崩溃。

但是当我为新的 MainApplication 创建一个新的应用程序标签时,我在 IDE 中遇到错误,例如 Attribute android:allowBackup is not allowed here

我想你可以 startKoinApplication

里面

MainApplication.kt

class MainApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        startKoin {
            ...
        }
        
    }
}

AndroidManifest.xml

<manifest ...>

    <application
        android:name=".MainApplication"
        ...>
        ...
    </application>

</manifest>