问题的背景
我目前正在学习如何将 MVVM 模式与 Compose 和依赖注入与 Dagger-Hilt 结合使用。
我需要创建一个 FusedLocationProviderClient 以便我可以从我的视图模型更新我的 GoogleMap 可组合项的位置状态。
注意事项
我认为 FusedLocationProviderClient 应该从 Main Activity 创建,因为它是特定于 android 的操作(并且它需要活动上下文)。我也不想将我的活动上下文传递给我的视图模型,因为它们会导致内存泄漏。
同时,由于我使用的是 Dagger-Hilt,我不需要在 Activity 中创建我的 ViewModel,因为它们可以很容易地注入到我的可组合屏幕中:
@Composable
fun MainScreen(viewModel : MainViewModel = hiltViewModel()) {/*UI logic*/}
在我的
MainActivity
中,setContent{}
中唯一的可组合项是具有 NavHost
和 NavGraphBuilder
的函数:
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
private lateinit var navController: NavHostController
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
private var latitude = 0.0
private var longitude = 0.0
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)
setContent {
MyTheme {
navController = rememberAnimatedNavController()
Navigation(navController)
}
}
}
问题
所以,在遵循 MVVM 原则的同时,如果不必在 MainActivity 中创建 ViewModel,我如何将
FusedLocationProviderClient
注入我的 ViewModel?
谢谢!
注意:我也在尝试避免使用 AndroidViewModel 获取上下文,因为单元测试会更加困难。