Android Compose 悬浮窗

今天需要写一个悬浮窗,但是在 Compose 中显示悬浮窗会遇到生命周期问题,我搜了一下,竟然有博主还要付费 才给看,我真的是,开源社会不过是闻道有先后 ,大家互帮互助才有未来,这样明目张胆的放几张收款码让付款才给看几行代码,至于吗?吃相如此难看!看看源码还是可以翻出来的,这里免费给大家分享,开源万岁!我的文章不要求关注,不要求付费,不要求会员,只求一个点赞认可,感谢各位。

今天遇到的问题是两个报错,相信大家主要难以解决的也是这两个问题:

kotlin 复制代码
ViewTreeLifecycleOwner not found from androidx.compose.ui.platform.ComposeView
kotlin 复制代码
Composed into the View which doesn't propagateViewTreeSavedStateRegistryOwner!

解决办法:

groovy 复制代码
implementation("androidx.lifecycle:lifecycle-service:2.5.1")
kotlin 复制代码
import android.graphics.PixelFormat
import android.view.WindowManager
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ComposeView
import androidx.lifecycle.LifecycleService
import androidx.lifecycle.setViewTreeLifecycleOwner
import androidx.savedstate.SavedStateRegistry
import androidx.savedstate.SavedStateRegistryController
import androidx.savedstate.SavedStateRegistryOwner
import androidx.savedstate.setViewTreeSavedStateRegistryOwner
import com.puremic.karaoke.global.tuning.TuningItemNotifier
import com.puremic.karaoke.ui.theme.PuremicKaraokeTheme

class NotifierService: LifecycleService(), SavedStateRegistryOwner {
    private val savedStateRegistryController by lazy {
        SavedStateRegistryController.create(this)
    }

    override val savedStateRegistry: SavedStateRegistry
        get() = savedStateRegistryController.savedStateRegistry

    override fun onCreate() {
        super.onCreate()
        savedStateRegistryController.performAttach()
        savedStateRegistryController.performRestore(null)

        val windowManager = getSystemService(WindowManager::class.java)
        val params = WindowManager.LayoutParams(
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
            PixelFormat.TRANSLUCENT
        )

        val composeView = ComposeView(this).apply {
            setViewTreeLifecycleOwner(this@NotifierService)
            setViewTreeSavedStateRegistryOwner(this@NotifierService)
            setContent {
                PuremicKaraokeTheme {
                    Notifier()
                }
            }
        }
        windowManager.addView(composeView, params)
    }

    @Composable
    private fun Notifier() {
        Box(
            modifier = Modifier.fillMaxSize()
        ) {
            TuningItemNotifier()
        }
    }
}

解决问题的无非就是那三四行代码,祝大家学业有成,步步高升

相关推荐
网安蟹佬霸3 分钟前
Webshell免杀与检测实战:从一句话木马到加密流量
android·安全·web安全·网络安全·黑客·网安·渗透测试·
阿巴斯甜3 小时前
Android SharedMemory 详细使用
android
sun0077003 小时前
android的dns的常见错误resolv
android
恋猫de小郭4 小时前
Flutter A2UI 的正确用法,怎么把 AI 和动态 UI 结合有效生产
android·前端·flutter
余额瞒着我当琳4 小时前
C++--vector第二讲:手写 C++ STL:vector 源码剖析与迭代器失效分析
android·java·c++
程序员-珍4 小时前
安卓开发:同名 styles.xml 在不同分支/文件夹的合并规则
android·xml·前端
我命由我123454 小时前
Compose Codelab 学习 - Compose 中的基本布局
android·java·java-ee·kotlin·android studio·android-studio·android runtime
ii_best4 小时前
手机自动化脚本按键精灵实战:随机布局安全数字键盘的自动化输入方案
android·运维·ios·自动化·手机
2601_965798474 小时前
Boutique Business Consulting WordPress Architecture & SEO Setup
android·theme·wordpress
三少爷的鞋5 小时前
Android 架构进阶:为什么项目越大,越需要把对象创建权拿走
android