Android Fragments 在可组合互操作性中使用AndroidView时,未调用片段的onStart()和onResume()

8hhllhi2  于 2023-11-19  发布在  Android
关注(0)|答案(1)|浏览(126)

我正在使用Compose的AndroidView来重用我的Fragment,其中有GoogleMap。Map视图将像往常一样在onStart()onResume()上启动和恢复。

override fun onStart() {
        super.onStart()
        Timber.d("Chargers Fragment OnStart")
        bi.map.onStart()
    }

    override fun onResume() {
        super.onResume()
        Timber.d("Chargers Fragment OnResume")
        bi.map.onResume()

字符串
我创建了一个FragmentContainer Composable来重用片段:

@Composable
fun FragmentContainer(
    containerId: Int,
    modifier: Modifier = Modifier,
    fragmentManager: FragmentManager,
    commit: FragmentTransaction.(containerId: Int) -> Unit,
    onFragmentViewCreated: (containerId: Int) -> Unit
) {
    var initialized by rememberSaveable { mutableStateOf(false) }

    AndroidView(
        modifier = modifier,
        factory = { context ->
            FragmentContainerView(context)
                .apply { id = containerId }
        },
        update = { view ->
            if (initialized) {
                fragmentManager.onContainerAvailable(view)
                onFragmentViewCreated(view.id)
            } else {
                fragmentManager.commit { commit(view.id) }
                initialized = true
            }
        }
    )
}

private fun FragmentManager.onContainerAvailable(view: FragmentContainerView) {
    val method = FragmentManager::class.java.getDeclaredMethod(
        "onContainerAvailable",
        FragmentContainerView::class.java
    )
    method.isAccessible = true
    method.invoke(this, view)
}


这个屏幕是底部导航的一部分,当导航到其他屏幕时,onPause()根本没有被调用,回到同一个屏幕时,它不会调用onStart()onResume()。我想这就是为什么我的Map没有加载。
我想以某种方式触发生命周期,如果可能的话,纠正我,如果我在一些错误的方向。

uttx8gqw

uttx8gqw1#

当您导航离开并返回时,FragmentContainerView仍然存在于视图层次结构中,因此它不会经历生命周期事件onStart、onResume。
创建Map视图模型

class MapViewModel : ViewModel() {
    
}

字符串
使用视图模型管理Map状态

class MapFragment : Fragment() {
    private val mapViewModel: MapViewModel by viewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // Initialize and configure your map 
        // mapViewModel.initMap()
    }

    override fun onStart() {
        super.onStart()
        
    }

    override fun onResume() {
        super.onResume()
      
    }

}


在你的作品中使用它

@Composable
fun MapScreen() {
    val mapViewModel: MapViewModel = viewModel()

    // val map = mapViewModel.getMap()

    // Render your map in the Composable
}

相关问题