首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jetpack在铸造LocalContext.current时组合预览呈现问题

Jetpack在铸造LocalContext.current时组合预览呈现问题
EN

Stack Overflow用户
提问于 2022-05-23 08:35:02
回答 4查看 1.9K关注 0票数 0
代码语言:javascript
运行
复制
Android Studio Chipmunk 2021.2.1; 
Compose Version = '1.1.1'; 
Gradle  Version 7.4.2; 
Kotlin 1.6.10;

有一点,一切都很正常。然后出现了这个错误,当我试图在这个项目和另一个项目中调用"LocalContext.current“并将"context.applicationContext作为应用程序”时,预览就停止了。它曾经与"LocalContext.current“一起工作

试过不同版本的作曲,科特林,格拉德尔。

渲染问题

com.android.layoutlib.bridge.android.BridgeContext :不能将类(com.android.layoutlib.bridge.android.BridgeContext转换为android.app.Application类,而android.app.Application处于加载程序的未命名模块( com.intellij.ide.plugins.cl.PluginClassLoader @3a848149),在com.client.personalfinance.screens.ComposableSingletons$AccountScreenKt$lambda-2$1.invoke(AccountScreen.kt:136)上,在com.client.personalfinance.screens.ComposableSingletons$AccountScreenKt$lambda-2$1.invoke(AccountScreen.kt:133)上,在androidx.compose.runtime上.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)在androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34)中的副产物( 107)在androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:34) (美国)和(美国)( androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228) )(美国)( androidx.compose.material.TextKt.ProvideTextStyle(Text.kt:265 )

代码语言:javascript
运行
复制
@Preview(showBackground = true) 
@Composable fun PrevAccountScreen() {
    val context  = LocalContext.current
    val mViewModel: MainViewModel =
             viewModel(factory = MainVeiwModelFactory(context.applicationContext as Application))
    AccountScreen(navController = rememberNavController(), viewModel = mViewModel)
 }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2022-05-24 19:38:18

当您需要访问特定于Android生命周期的东西时,我找到了获得预览功能的最佳方法,例如应用程序、活动、FragmentManager、ViewModel等等,就是创建一个什么都不做的接口实现。

使用FragmentManager的示例:

代码语言:javascript
运行
复制
@Composable
@OptIn(ExperimentalAnimationApi::class)
fun MyFragmentView(
    fragmentManager: FragmentManager
) {
    Button(modifier = Modifier.align(Alignment.End),
           onClick = {         
              MyDialogFragment().show(fragmentManager, "MyDialogTag")
           }
    ) {

        Text(text = "Open Dialog")
    }

}

预览功能:

代码语言:javascript
运行
复制
object PreviewFragmentManager: FragmentManager()

@Preview
@Composable
fun MyFragmentViewPreview() {
    MyFragmentView(
        fragmentManager = PreviewFragmentManager
    )
}

现在您的预览功能将呈现。

您可以使用ViewModel做同样的事情--只需让ViewModel扩展一个接口即可。

代码语言:javascript
运行
复制
import androidx.compose.runtime.*
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.viewmodel.compose.viewModel
import kotlinx.coroutines.flow.StateFlow

interface MyViewModel {
   val state: StateFlow<SomeState>
   fun doSomething(input: String)
}

class MyViewModelImpl: MyViewModel, ViewModel() {
   // implement interface's required values/functions
}

object PreviewViewModel: MyViewModel() 

@Composable
fun MyView(viewModel: MyViewModel = viewModel<MyViewModelImpl>()) {
   // UI building goes here
}

@Composable
@Preview
fun MyViewPreview() {
    MyView(viewModel = PreviewViewModel)
}

在您的示例中,我建议执行上面概述的ViewModel步骤,而不是在预览中乱搞LocalContext。

票数 1
EN

Stack Overflow用户

发布于 2022-05-25 07:26:55

如果尝试注入ViewModel,则无法呈现可组合的预览。

有很多方法可以避免这个问题。但是对我来说,最简单、最清晰的方法就是不呈现一个具有viewModel的可组合的人。

要做到这一点,您可以简单地将可组合的MyView的内容提取到另一个可组合的MyViewContent中。

MyView可组合将声明MyViewContent将需要的所有状态(他将处于状态),而MyViewContent组合将以这些值作为参数(他将成为无状态的)。

通过这种方式,您可以确保尊重状态提升模式,因为您的UI的主要部分将是无状态的,这要归功于MyViewContent。

票数 1
EN

Stack Overflow用户

发布于 2022-05-23 09:36:44

这是一个错误的行viewModel(factory = MainVeiwModelFactory(context.applicationContext as Application)

您可以看到您的"as“是不正确的。尝试创建一个没有上下文的空ViewModel。它通过预览来解决问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72345509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档