我们如何在服务中初始化viewModel。在片段中,我们使用 Kotlin 委托“ by ActivityViewModels ”来完成此操作。或者我们可以使用ViewModelProvider().get来完成。但据我发现,我们无法在服务中执行此操作,因为我们需要一个“ ViewModelStoreOwner ”之类的活动或片段。
那么这是否是在服务中初始化 ViewModel 的最佳实践呢?
我知道将上下文传递给 ViewModel 不是最佳实践。但我想知道将上下文实例作为 ViewModel 中函数的局部参数是否可以?
因为在这种情况下,函数使用上下文并在函数结束时释放该上下文引用。
请假设我们不想使用 AndroidViewModel 来获取应用程序上下文。
例如:
class MyViewModel : ViewModel(){
initColors(context:Context){
//do something with context like getting colors from resourcse
}
}
Run Code Online (Sandbox Code Playgroud)
并在片段中:
class Myfrgament:Fragment(){
private val viewModel: LessonFragmentViewModel by viewModels{}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewModel.initColors(requireContext())
}
Run Code Online (Sandbox Code Playgroud)
}
我使用导航组件和底部导航栏,并为了处理选项卡栏导航,请调用以下代码
绑定.bottomNavigationView.setupWithNavController(navController)
在上一个版本之前,我在使用 setupWithNavController() 时保存每个片段的状态时遇到了一个大问题,但是由于最新版本的导航 API(>=:2.4.0),它支持多个返回堆栈,我可以轻松在选项卡之间导航,无需担心再次加载所有数据。
但我发现每次导航每个选项卡时,都会调用 OnViewCreated 函数!这给我带来了一些问题。
例如,OnViewCreated是一个使用repeatOnLifeCycle来收集流量的地方,而OnViewCreated的这种重复调用导致了很多流量的订阅者!
甚至在文件中说:
最佳实践是在生命周期初始化时调用此函数。例如,Activity 中的 onCreate 或 Fragment 中的 onViewCreated。否则,可能会创建多个重复执行相同操作的协程并同时执行。
它假定 OnViewCreated 是一个被调用一次的地方!
明显的问题是,首先,这种行为是一个问题还是预期的?如果是预期的话,我们可以在哪里收集流量?请详细说明为什么会发生这种情况?
android android-navigation android-bottomnav android-navigation-graph