当前位置: 首页 > news >正文

记录解决一次预览出现问题的经历

发现问题

我在android studio中预览某个ui时出现问题:

java.lang.ClassCastException: class com.android.layoutlib.bridge.android.ApplicationContext cannot be cast to class android.app.Application (com.android.layoutlib.bridge.android.ApplicationContext and android.app.Application are in unnamed module of loader com.intellij.ide.plugins.cl.PluginClassLoader @33a840ae)

我经过检查发现是在预览函数中

val application = LocalContext.current.applicationContext as Application

这行代码会出现问题,原因是在预览环境下返回的是 ComposeViewAdapter 的上下文,而不是预期的 Application 上下文

经过修改后,我 Mock 了整个ViewModel:

val previewViewModel = object : ImageDetailViewModel(Application()) {  // 步骤2:重写 imageItem,提供一个假的 StateFlow    private val _imageItem = MutableStateFlow<ImageEntity?>(  ImageEntity(  uri = imageUri.toString(),  description = "一张漂亮的风景照",  date = System.currentTimeMillis()  )  )  override val imageItem: StateFlow<ImageEntity?> = _imageItem  // 步骤3:重写 tags,提供一个假的标签列表 StateFlow    private val _tags = MutableStateFlow<List<TagEntity>>(  listOf(  TagEntity(tagName = "风景"),  TagEntity(tagName = "天空"),  TagEntity(tagName = "山脉")  )  )  override val tags: StateFlow<List<TagEntity>> = _tags  // 步骤4:重写所有方法,让它们在预览中什么都不做,或者模拟简单的 UI 交互  override fun loadTagsForImage(uri: String) {  // 在预览中,数据是硬编码的,所以这个方法不需要执行任何操作  }  override fun addTag(tagName: String) {  // 为了让预览更具交互性,我们可以模拟添加标签的行为  val currentTags = _tags.value.toMutableList()  currentTags.add(TagEntity(tagName = tagName.trim()))  _tags.value = currentTags  }  
}

然后出现了问题:

java.lang.NullPointerException: Cannot invoke "android.content.Context.getApplicationContext()" because "this.mBase" is null at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:152)

我检查后发现整个UI文件中并没有用到 Application 这个上下文,经检查,我发现是 Mock 类继承了 ImageDetailViewModel,在执行初始化时,首先执行了 ImageDetailViewModel

open class ImageDetailViewModel(application: Application) : AndroidViewModel(application) {  private val dao = AppDatabase.getDatabase(application).photoTagDao()...
}

这正是出现空指针异常的原因。

解决方案

通过新建一个 ImageDetailViewModelInterface 让 Mock 类和 ImageDetailViewModel 都从这个接口类派生,然后将 ImageDetailScreen 接受的参数改为接受这个接口类。

http://www.gsyq.cn/news/34994.html

相关文章:

  • 2025年天然气脱硫消泡剂订做厂家权威推荐榜单:活化剂/二氧化碳脱除 /天然气脱碳剂厂家精选
  • 2025年靠谱的汽车改装厂家最新推荐权威榜
  • 告别“人眼扫描”:国标GB28181算法算力平台EasyGBS智能搜索功能助力重塑海量视频监控管理效率
  • 复现笔记--hvisor硬盘部署系统用户与维护手册(LoongArch)
  • 2025年10月武汉刑事律师评价榜:五名标杆案例深度对比
  • revit开发控件wpf
  • 2025年福建电商数据分析公司权威推荐榜单:商品趋势分析/抖音数据分析/AI商品图服务商源头厂家精选
  • 2025 年 10 月预制舱厂家推荐排行榜,光伏预制舱,风电光伏预制舱,储能预制舱,一二次设备电气预制舱,SVG 预制舱,控制预制舱公司推荐
  • 2025年酒吧氛围灯制造商权威推荐榜单:万圣节南瓜灯/酒吧装饰灯/圣诞树小夜灯源头厂家精选
  • 2025年杭州美术画室机构权威推荐榜单:画室/美术培训画室 /孪生画室源头机构精选
  • P11292 【MX-S6-T4】「KDOI-11」彩灯晚会 解题报告
  • 2025年比较好的数字化涂装生产线厂家推荐及选择参考
  • 2025年江苏老酒回收服务商权威推荐榜单:洋酒回收/虫草回收/整箱茅台回收服务商精选
  • 20251030模拟赛
  • HarmonyOS自动化测试与持续集成实战指南
  • GEO 源头厂家独家王炸:南方网通讯灵 AI 业内首创“3+4+3” 智能生态营销体系,领爆AI搜索新浪潮
  • 2025年可靠的水电镀表面处理厂家推荐及选购参考榜
  • JYU-ACM算法协会每日一题题解(每日刷新)
  • 2025年国内成人书法培训排名TOP5:软笔书法、成人书法、草书书法、毛笔书法实力品牌优选
  • 2025年10月珠海酒店推荐榜:十家高分住宿全维度对比
  • pt-online-schema-change无锁变更及腾讯云的dmc数据库操作,字段加索引查询 500kb限制
  • 2025年靠谱的自发光材料供应商厂家推荐及采购参考
  • 2025年热门的交流充电桩高评价厂家推荐榜
  • 2025年气动打标针直销厂家权威推荐榜单:进口打标机/高温打标机 /刻划打标机源头厂家精选
  • 统信服务器e和a的区别
  • 20251018模拟赛
  • 2025年口碑好的粉末冶金齿轮厂家实力及用户口碑排行榜
  • Affinity Photo 2.6.5 (macOS, Windows) - 梦寐以求的照片编辑器
  • Affinity Publisher 2.6.5 (macOS, Windows) - 页面布局和设计的强大平台
  • Affinity Designer 2.6.5 (macOS, Windows) - 制作最精美的插图和设计