如何在不使用 @Composable 注释的情况下为撰写函数创建扩展?

Posted

技术标签:

【中文标题】如何在不使用 @Composable 注释的情况下为撰写函数创建扩展?【英文标题】:How to create an extension for compose functions without using @Composable annotation? 【发布时间】:2022-01-23 18:38:10 【问题描述】:

问题描述

我正在为使用自定义视图的撰写函数创建一个抽象:

@Composable
fun DisposeBanner(bannerView: BannerView) 
    DisposableEffect(key1 = true) 
        onDispose 
            bannerView.destroyAd()
        
    

但是,由于这个函数实际上并不渲染任何组件,我不希望它坚持使用 @Composable 标记,而是表明它只能通过扩展在 compose 函数中使用。

我的失败尝试

尝试做的时候:

fun Composable.disposeBanner(bannerView: BannerView) 
    DisposableEffect(key1 = true) 
        onDispose 
            bannerView.destroyAd()
        
    

我收到一条错误消息:“@Composable 调用只能在 @Composable 函数的上下文中发生”

有没有可能做我想做的事?

【问题讨论】:

【参考方案1】:

Composable 是一个函数。您不能对功能进行扩展。并且错误清楚地表明您正在尝试在不可组合的函数中使用可组合的 DisposableEffect 函数(这是一个不呈现任何 ui 的普通可组合函数)。

你想多了。有很多不呈现任何 UI 的组合组件。 @Composable 注解不会以任何方式绑定到 UI。所以做一个不渲染任何东西的可组合函数是完全完全没问题的

【讨论】:

以上是关于如何在不使用 @Composable 注释的情况下为撰写函数创建扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用视图集的情况下序列化 Django 中的注释字段?

Spring Boot - 如何在不使用 spring 注释的情况下在运行时获取端口

使用 iText 在不丢失注释的情况下裁剪 pdf

如何在不取消选择注释的情况下更新标注视图?

如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?

在不修改实体类(注释)或数据上下文(使用 fluentapi)的情况下禁用标识(自动递增)