标签: koin

如何使用Koin DI将应用程序上下文从“应用程序”模块注入到“网络”模块

我正在开发基于带有2个模块(:app和:network)的Koin DI(ver:1.0.1)的应用程序。我在:network模块中具有“上下文”的要求。以下是我的实现方式:

**Module**:
val appModule = module {
    viewModel { LoginViewModel(get()) }
}

**Activity**:
private val viewModel by viewModel<LoginViewModel>()

**ViewModel**:
class LoginViewModel(val context: Context): ViewModel() {
  ...
  // Send "context" to network class in :network module
  ...
 }
Run Code Online (Sandbox Code Playgroud)

问题:有什么方法可以将上下文直接发送到:network模块中的网络类?

android koin

12
推荐指数
3
解决办法
3230
查看次数

如何使用 Koin DI 在活动之间共享相同的 ViewModel 实例?

Koin在 Kotlin 中使用库进行 DI

Koin 提供 by viewmodel()获取 ViewModel 实例by sharedViewModel()以获取片段中的相同实例。

如何在活动中获得相同的 ViewModel 实例?我没有找到任何方法来实现这一目标。

android dependency-injection kotlin koin

12
推荐指数
2
解决办法
7480
查看次数

找不到 org.koin:koin-core:2.2.2

我最近jcenter()从项目级构建 Gradle 中删除了存储库。

从那时起,Koin(版本:2.2.2)开始给我以下编译时错误:

Could not find org.koin:koin-core:2.2.2

android maven-central jcenter koin

12
推荐指数
2
解决办法
2万
查看次数

使用 Koin 进行依赖注入时,Jetpack Compose Preview 不起作用

我想在我的应用程序中使用 Jetpack Compose。我已经在使用 Koin 进行 DI 了。因为我的 BaseFragment 中有很多方便的方法,所以我想继承它并使用 compose 构建相应的视图。

现在的问题是,当在 BaseFragment 中使用 DI 并继承它时,将不会显示可组合项的预览,并出现以下错误消息:

预览控制台中的错误消息

并抛出以下异常:

java.lang.IllegalStateException: KoinApplication has not been started
    at org.koin.core.context.GlobalContext.get(GlobalContext.kt:36)
    at org.koin.java.KoinJavaComponent.getKoin(KoinJavaComponent.kt:122)
    at org.koin.java.KoinJavaComponent.get(KoinJavaComponent.kt:87)
    at org.koin.java.KoinJavaComponent.get$default(KoinJavaComponent.kt:81)
    at org.koin.java.KoinJavaComponent.get(KoinJavaComponent.kt)
    ...
Run Code Online (Sandbox Code Playgroud)

我的 BaseFragment 看起来像这样

public abstract class BaseFragment {


    private final ActiveViewIdInteractor activeViewIdInteractor =
            new ActiveViewIdInteractor(KoinJavaComponent.get(ActiveViewIdService.class));
...
Run Code Online (Sandbox Code Playgroud)

我继承的片段看起来像这样

class ComposeDemoFragment: BaseFragment() {
   ...

   @Composable
    fun ComposeDemoFragmentContent() {
        Text(text = "Hello World",
            Modifier
                .fillMaxWidth()
                .background(Color.Cyan)
        )
    }

    @Preview
    @Composable
    private fun Preview() {
        ComposeDemoFragmentContent()
    }

Run Code Online (Sandbox Code Playgroud)

如果在不继承自 BaseFragment 的 …

android android-studio koin android-jetpack-compose android-jetpack-compose-preview

12
推荐指数
1
解决办法
4120
查看次数

Koin如何注入Android活动/ appcompatactivity之外

Koin是一个全新的轻量级DI库,可用于Android以及独立的kotlin应用程序.

通常你注入这样的依赖:

class SplashScreenActivity : Activity() {

    val sampleClass : SampleClass by inject()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}
Run Code Online (Sandbox Code Playgroud)

用这个inject()方法.

但是如果在Activity上下文不可用的地方(例如活动之外)注入东西呢?

android dependency-injection inversion-of-control kotlin koin

10
推荐指数
3
解决办法
3916
查看次数

清除共享视图模型

我正在使用 Koin 将 viewModel 注入片段。我的应用程序是单一活动。我只需要在 servisFragment 和 partFragment 中使用 sharedViewModel。我想在用红色标记的导航后从 Activity 中清除该 viewModel。

我怎样才能做到这一点?

导航

注入viewModel的代码

    private val servisViewModel by sharedViewModel<ServisViewModel>()
Run Code Online (Sandbox Code Playgroud)

Koin 共享视图模型

inline fun <reified T : ViewModel> Fragment.sharedViewModel(
    name: String? = null,
    noinline from: ViewModelStoreOwnerDefinition = { activity as 
    ViewModelStoreOwner },
    noinline parameters: ParametersDefinition? = null
) = lazy { getSharedViewModel<T>(name, from, parameters) }
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助。

android kotlin android-viewmodel koin android-jetpack

10
推荐指数
1
解决办法
1671
查看次数

Koin:NoBeanDefFoundException,检查你的模块定义

koin测试结果如下:

org.koin.core.error.NoBeanDefFoundException: No definition found for '<class_name>' has been found. Check your module definitions.

该课程EmailValidatorUtilImpl实施得很好,

import org.junit.After
import org.junit.Assert
import org.junit.Before
import org.junit.Test
import org.koin.core.context.startKoin
import org.koin.core.context.stopKoin
import org.koin.dsl.module
import org.koin.test.KoinTest
import org.koin.test.inject

class EmailValidatorUtilImpl : EmailValidatorUtil {

    private val pattern = Pattern.compile(EMAIL_PATTERN)
    private var matcher: Matcher? = null

    override fun validateEmail(email: String): Boolean {
        matcher = pattern.matcher(email)
        return matcher!!.matches()
    }

    companion object {
        private val EMAIL_PATTERN = "^[a-zA-Z0-9#_~!$&'()*+,;=:.\"(),:;<>@\\[\\]\\\\]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*$"
    }
}

Run Code Online (Sandbox Code Playgroud)

并且,注入 KoinTest 如下:


class EmailValidatorUtilImplTest : KoinTest, …
Run Code Online (Sandbox Code Playgroud)

android unit-testing dependency-injection kotlin koin

10
推荐指数
2
解决办法
9193
查看次数

当 Koin 可用时,我为什么要使用 Android Hilt (Dagger2)

我喜欢将我的 Android 应用程序中使用的第三方库的数量保持在绝对最低限度。

我开始使用Dagger2,然后切换到Koin.

Koin就是这么大的进步Dagger2

Koin 具有内置的 ViewModel 支持,不需要任何“额外”的工作人员。

Koin 允许您以最小的努力在任何地方注入任何东西,它非常棒。

在 Android Hilt 公告中,我完成了一个峰值来评估它,因为它会减少我对 3rd 方库的依赖。

完成我的尖峰努力后,我不明白为什么有人会使用 Hilt。

例如:

为了Koin注入一个Worker我有工作器实现KoinComponent,为了Hilt注入一个工作器,我需要禁用默认WorkerManager初始化,并使用两个注释@WorkerInject& @Assisted

我错过了什么吗?

android koin dagger-hilt

10
推荐指数
2
解决办法
4080
查看次数

将 viewModel 注入到 @Composable

我的 ProfileScreen 有 viewModel。

@Composable
fun ProfileScreen() {
    val viewModel: ProfileViewModel = viewModel()
    ...
}
Run Code Online (Sandbox Code Playgroud)

每次我调用 ProfileScreen 时,都会创建新的 viewModel。我如何为我的 ProfileScreen 只创建一个 viewModel 实例。我尝试按照https://insert-koin.io/docs/reference/koin-android/compose/注入 viewModel但当我尝试时

val viewModel: ProfileViewModel = viewModel()

Android Studio 抛出错误。

android dependency-injection kotlin koin android-jetpack-compose

10
推荐指数
1
解决办法
4951
查看次数

在 Java 类中注入 Koin

我正在尝试将当前项目中的Dagger 2 替换为Koin,并且我不想在 Kotlin 中重写某些类来使用它。

可以在 Java 类中注入 Koin 吗?

在 Kotlin 中只是

// Inject MyPresenter
val presenter : MyPresenter by inject()
Run Code Online (Sandbox Code Playgroud)

谢谢

java android service-locator kotlin koin

9
推荐指数
3
解决办法
6689
查看次数