我正在开发基于带有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模块中的网络类?
我Koin
在 Kotlin 中使用库进行 DI
Koin 提供 by viewmodel()
获取 ViewModel 实例by sharedViewModel()
以获取片段中的相同实例。
如何在活动中获得相同的 ViewModel 实例?我没有找到任何方法来实现这一目标。
我最近jcenter()
从项目级构建 Gradle 中删除了存储库。
从那时起,Koin(版本:2.2.2)开始给我以下编译时错误:
Could not find org.koin:koin-core:2.2.2
我想在我的应用程序中使用 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
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
我正在使用 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)
感谢您的任何帮助。
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 应用程序中使用的第三方库的数量保持在绝对最低限度。
我开始使用Dagger2
,然后切换到Koin
.
Koin
就是这么大的进步Dagger2
。
Koin
具有内置的 ViewModel 支持,不需要任何“额外”的工作人员。
Koin
允许您以最小的努力在任何地方注入任何东西,它非常棒。
在 Android Hilt 公告中,我完成了一个峰值来评估它,因为它会减少我对 3rd 方库的依赖。
完成我的尖峰努力后,我不明白为什么有人会使用 Hilt。
例如:
为了Koin
注入一个Worker
我有工作器实现KoinComponent
,为了Hilt
注入一个工作器,我需要禁用默认WorkerManager
初始化,并使用两个注释@WorkerInject
& @Assisted
。
我错过了什么吗?
我的 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
我正在尝试将当前项目中的Dagger 2 替换为Koin,并且我不想在 Kotlin 中重写某些类来使用它。
可以在 Java 类中注入 Koin 吗?
在 Kotlin 中只是
// Inject MyPresenter
val presenter : MyPresenter by inject()
Run Code Online (Sandbox Code Playgroud)
谢谢
android ×10
koin ×10
kotlin ×6
android-jetpack-compose-preview ×1
dagger-hilt ×1
java ×1
jcenter ×1
unit-testing ×1