今天需要写一个悬浮窗,但是在 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()
}
}
}
解决问题的无非就是那三四行代码,祝大家学业有成,步步高升