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 )
@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)
}
发布于 2022-05-24 19:38:18
当您需要访问特定于Android生命周期的东西时,我找到了获得预览功能的最佳方法,例如应用程序、活动、FragmentManager、ViewModel等等,就是创建一个什么都不做的接口实现。
使用FragmentManager的示例:
@Composable
@OptIn(ExperimentalAnimationApi::class)
fun MyFragmentView(
fragmentManager: FragmentManager
) {
Button(modifier = Modifier.align(Alignment.End),
onClick = {
MyDialogFragment().show(fragmentManager, "MyDialogTag")
}
) {
Text(text = "Open Dialog")
}
}
预览功能:
object PreviewFragmentManager: FragmentManager()
@Preview
@Composable
fun MyFragmentViewPreview() {
MyFragmentView(
fragmentManager = PreviewFragmentManager
)
}
现在您的预览功能将呈现。
您可以使用ViewModel做同样的事情--只需让ViewModel扩展一个接口即可。
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。
发布于 2022-05-25 07:26:55
如果尝试注入ViewModel,则无法呈现可组合的预览。
有很多方法可以避免这个问题。但是对我来说,最简单、最清晰的方法就是不呈现一个具有viewModel的可组合的人。
要做到这一点,您可以简单地将可组合的MyView的内容提取到另一个可组合的MyViewContent中。
MyView可组合将声明MyViewContent将需要的所有状态(他将处于状态),而MyViewContent组合将以这些值作为参数(他将成为无状态的)。
通过这种方式,您可以确保尊重状态提升模式,因为您的UI的主要部分将是无状态的,这要归功于MyViewContent。
发布于 2022-05-23 09:36:44
这是一个错误的行viewModel(factory = MainVeiwModelFactory(context.applicationContext as Application)
您可以看到您的"as“是不正确的。尝试创建一个没有上下文的空ViewModel。它通过预览来解决问题。
https://stackoverflow.com/questions/72345509
复制相似问题