kotlin 布局预览,使用Android Studio显示自定义视图时出现问题

qv7cva1a  于 2023-04-21  发布在  Kotlin
关注(0)|答案(2)|浏览(298)

Android Studio停止生成我的布局预览。问题是由于存在自定义视图。
错误:
渲染问题
java.lang.NullPointerException 在
com.my.app.views.bars.TopBar$mainViewModel$2.invoke(TopBar. kt:26) at com.my.app.views.bars.TopBar$mainViewModel$2.invoke(TopBar. kt:25) at * layoutlib *. * internal *. kotlin. SynchronizedLazyImpl. getValue(LazyJVM. kt:74)
除了这个预览问题,应用程序工作正常。
我重新构建了项目并使缓存无效,但这并没有解决问题。

    • 编辑:**我找到问题了,来自下面一行,有道理!(findViewTreeViewModelStoreOwner()!!)
private val mainViewModel by lazy {
    ViewModelProvider(findViewTreeViewModelStoreOwner()!!).get<MainViewModel>()
}

类似的职位:
Kotlin delegate property causes a preview rendering error in Android Studio
Custom View does not render in Design View in Android Studio?

shstlldc

shstlldc1#

你面对NPE是因为当你的自定义视图处于编辑模式时(当它在预览中呈现时),没有合适的视图树所有者,你会得到null。你可以使用isInEditMode()来检查:
public boolean isInEditMode()**
指示此视图当前是否处于编辑模式。在开发人员工具中显示时,视图通常处于编辑模式。例如,如果此视图由可视化用户界面生成器绘制,则此方法应返回true。如果子类的正常行为可能会干扰宿主环境,则应检查此方法的返回值以提供不同的行为。例如:类在其构造函数中生成一个线程,绘图代码依赖于特定于设备的特性,等等。通常在自定义小部件的绘图代码中检查此方法。

private val mainViewModel by lazy {
    if (!isInEditMode) {
        ViewModelProvider(findViewTreeViewModelStoreOwner()!!).get<MainViewModel>()
    } else {
        null
    }
}
scyqe7ek

scyqe7ek2#

Marcin Orlowski的答案实际上是有效的,但我发现了一个更短的方法,即:

override fun onDraw(canvas: Canvas) {
    if (isInEditMode) return
    ...
}

相关问题