如何使用 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
我想你可以 startKoin
在 Application
里面
MainApplication.kt
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
...
}
}
}
AndroidManifest.xml
<manifest ...>
<application
android:name=".MainApplication"
...>
...
</application>
</manifest>
我想创建一个启动画面并在确定用户的身份验证状态后显示它。我有一个名为 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:
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
我想你可以 startKoin
在 Application
MainApplication.kt
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
...
}
}
}
AndroidManifest.xml
<manifest ...>
<application
android:name=".MainApplication"
...>
...
</application>
</manifest>