【问题标题】:Jetpack Compose Preview not working when using Koin for Dependency Injection在继承的类中使用 DI (Koin) 时,Jetpack Compose Preview 不起作用
【发布时间】:2022-08-10 22:40:22
【问题描述】:

我想在我的应用程序中使用 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)
    ...

我的 BaseFragment 看起来像这样

public abstract class BaseFragment {


    private final ActiveViewIdInteractor activeViewIdInteractor =
            new ActiveViewIdInteractor(KoinJavaComponent.get(ActiveViewIdService.class));
...

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

class ComposeDemoFragment: BaseFragment() {
   ...

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

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

如果在不从 BaseFragment 继承的 Fragment 中使用完全相同的预览,则一切正常。我已经包含了“Koin for Compose”的依赖项,并且还尝试过使用 CoKoin。在这一点上,我不知道如何处理错误消息,或者错误消息是否与实际问题几乎没有关系。

这是一个错误还是有办法绕过这个错误?

    标签: android android-studio android-jetpack-compose koin android-jetpack-compose-preview


    【解决方案1】:

    您的@Preview 代码正在由Android Studio 按原样运行,查看您的示例,您的ComposeDemoFragmentContent() 中没有任何使用Koin 的内容。但是,我猜这只是示例代码。

    在我的应用程序中,我们将 koin 组件注入到我们的主 PrimaryTheme{ } 中,该组件在与 @Preview 一起使用时会中断,我们遇到了与您看到的相同的错误。

    解决此问题的一种方法是为要注入的字段提供默认值,然后将您的 koin 代码放入 LocalInspectionMode 的检查中,例如

    val someField = remember { mutableStateOf("Default")}
    
    if (!LocalInspectionMode.current) {
      // We're _not_ executing in an Android Studio Preview.
    
      // Use your injected Koin instance here e.g.
      val myUseCase: CustomUseCase = get()
      someField.value = myUseCase.getSomeValue()         
    }
    
    Text(
      text = someField.value
    )
    
    

    因此,您的预览将使用默认值,但您的真实应用程序将使用 koin 注入值。

    【讨论】:

      【解决方案2】:

      发生这种情况是因为您的 @Preview 函数在您的 Activity 内。

      将其移动到文件的根目录,在活动类之外,预览将无错误地呈现。

      【讨论】:

        猜你喜欢
        • 2022-10-19
        • 2022-07-29
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 2021-07-05
        • 2021-08-14
        • 1970-01-01
        • 2023-03-02
        相关资源
        最近更新 更多