今天需要写一个悬浮窗,但是在 Compose 中显示悬浮窗会遇到生命周期问题,我搜了一下,竟然有博主还要付费才给看,我真的是,开源社会不过是闻道有先后,大家互帮互助才有未来,这样明目张胆的放几张收款码让付款才给看几行代码,至于吗?吃相如此难看!看看源码还是可以翻出来的,这里免费给大家分享,开源万岁!我的文章不要求关注,不要求付费,不要求会员,只求一个点赞认可,感谢各位。
今天遇到的问题是两个报错,相信大家主要难以解决的也是这两个问题:
ViewTreeLifecycleOwner not found from androidx.compose.ui.platform.ComposeView
Composed into the View which doesn’t propagateViewTreeSavedStateRegistryOwner!
解决办法:
implementation("androidx.lifecycle:lifecycle-service:2.5.1")
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.PuremicKaraokeThemeclass NotifierService: LifecycleService(), SavedStateRegistryOwner {private val savedStateRegistryController by lazy {SavedStateRegistryController.create(this)}override val savedStateRegistry: SavedStateRegistryget() = savedStateRegistryController.savedStateRegistryoverride 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)}@Composableprivate fun Notifier() {Box(modifier = Modifier.fillMaxSize()) {TuningItemNotifier()}}
}
解决问题的无非就是那三四行代码,祝大家学业有成,步步高升