gpt4 book ai didi

android - 撰写创建新的 ViewModel 实例

转载 作者:行者123 更新时间:2023-12-04 23:47:48 25 4
gpt4 key购买 nike

我在一个慢慢采用 Jetpack Compose 的项目中工作。多为单个Activity多个 Fragment s 应用程序,我们使用 Android 的导航组件来处理到每个屏幕的转换 (Fragment)。只要有可能,我们只替换 Fragment s' 带有 Composables 的 XML 布局。
到目前为止,案件的处理方式如下:
答:Fragment s 显示可组合项并处理导航:

class ScreenFragment : Fragment() {

// For observing events that trigger navigation
private val viewModel by lazyViewModel { ScreenViewModel() }

override fun onCreateView( ... ): View {
return ComposeView(requireContext()).apply {

setViewCompositionStrategy(DisposeOnLifecycleDestroyed(viewLifecycleOwner))

setContent {
AppTheme {
Screen(onBackPressed = { findNavController().navigateUp() })
}
}
}
}
...

}
B. 处理与 UI 相关的所有其他内容的可组合:
@Composable
fun CreatePassword(
onBackPressed: () -> Unit,
) {

// For observing UI states and events
val viewModel: CreatePasswordViewModel = viewModel()
...
}

如您所见,我们有屏幕的 ViewModel 的引用。在我们的 Fragment s 和我们的可组合物。到目前为止,这一直运行良好,可组合的 viewModel()函数总是返回 Fragment 的相同现有实例的 ViewModel .
当我们需要 ViewModel 的引用时,问题就来了。范围为 Activity关于可组合:
  • 我们创建 ViewModelActivity :
  • class MainActivity : AppCompatActivity() {

    private val viewModel by lazyViewModel { MainViewModel() }
    ...
    }
  • 获取 MainActivity 的引用资料的ViewModelFragment喜欢
  • class MainFragment : Fragment() {

    private val viewModel: MainViewModel by viewModels(::requireActivity)
    ...
    }
  • 我们得到了可组合的 ViewModel 的引用,如上所示(项目 B)

  • 通过这样做 Fragment具有 Activity 的相同实例的但可组合的没有。
    我的问题是,
    是否有可能获得 Activity 的引用?的ViewModel在可组合物中? 现在我只是传递 FragmentViewModel作为我的主要可组合屏幕的参数。

    最佳答案

    我设法传递了ActivityViewModel通过提供 ViewModelStoreOwner我的可组合如下:

    class ScreenFragment : Fragment() {

    // For observing events that trigger navigation
    private val viewModel by lazyViewModel { ScreenViewModel() }

    override fun onCreateView( ... ): View {
    return ComposeView(requireContext()).apply {

    setViewCompositionStrategy(DisposeOnLifecycleDestroyed(viewLifecycleOwner))

    setContent {
    val viewModelStoreOwner =
    compositionLocalOf<ViewModelStoreOwner> { requireActivity() }

    AppTheme {
    CompositionLocalProvider(
    LocalViewModelStoreOwner provides viewModelStoreOwner.current
    ) {
    Screen(onBackPressed = { findNavController().navigateUp() })
    }
    }
    }
    }
    }
    ...

    }

    关于android - 撰写创建新的 ViewModel 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71083948/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com