gpt4 book ai didi

java - 在 Android - Dagger 2 中注入(inject) ViewModelFactory 有什么意义

转载 作者:太空宇宙 更新时间:2023-11-03 12:44:19 32 4
gpt4 key购买 nike

我最近开始从事 Android 开发,并且来自 iOS 背景,依赖注入(inject)框架和 ViewModelFactories 等概念对我来说是一个新事物。在我看到的所有教程中,ViewModels 总是扩展 android.arch.lifecycle.ViewModel 提供的 ViewModel 类。如果 viewModel 有参数,那么必须创建一个 ViewModelFactory 并将其注入(inject)到 Dagger 的 Activity 中

@Provides
@ActivityScope
fun provideViewModelFactory(dependency: Dependency) : ViewModelProvider.Factory = CustomViewModelFactory(dependency)

CustomViewModelFactory 然后将负责创建 ViewModel。这一切都很好,但是,我并没有真正理解 viewModelFactory 的意义,因为我可以直接将 viewModels 注入(inject)到这样的 Activity 中:

@Module
class ViewModelModule(private val user: User) {
@ActivityScope
@Provides
fun provideMainViewModel() = MainViewModel(user = user)
fun provideOtherViewModel() = OtherViewModel()
}

@ActivityScope
@Subcomponent(modules = [ViewModelModule::class])
interface MainActivitySubComponent {
fun inject(activity: MainActivity)
}

@ApplicationScope
@Component()
interface ApplicationComponent {
fun addMainActivitySubComponent(viewModelModule: ViewModelModule) : MainActivitySubComponent
}

在我的 Activity 中

class MainActivity : AppCompatActivity() {

@Inject lateinit var viewModel: MainViewModel

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val subComponent = (application as MainApplication).component.addMainActivitySubComponent(ViewModelModule(User("NEW NAME")))

subComponent.inject(this)
}
}

那么当我可以立即在我的 Activity 中简单地注入(inject)一个 viewModel 时,ViewModelFactory 有什么意义呢?

最佳答案

让我们看看注入(inject) ViewModel 时会发生什么:

  1. 您的 Activity 得到(重新)创建。
  2. 您为所述 Activity 创建一个(子)组件。
  3. 您注入(inject)依赖项。

有趣的部分是第 3 部分,我们将在其中注入(inject)一些范围内的对象(例如单例),但会为其余的依赖项创建新对象。

每次您(重新)创建您的 Activity(-> 配置更改)时,这些对象将被再次创建,并且您将丢失状态。您可以使用 savedInstanceState 来保存一些数据,或者您可以想出一些其他方法来保存状态(例如 Singletons、保留的 Fragments,...)


另一方面,ViewModel promise 在方向更改之间保持状态。当我们在方向更改后从 ViewModelProviders 请求 ViewModel 时,我们将收到与之前相同的对象。我们不需要担心保存和恢复状态。

我们会重新创建工厂,但 Android/Support Library/Jetpack/Arch Components(无论现在叫什么)将存储 Viewmodel 并且仅在之前未创建它时创建它。在配置更改期间将重用以前的模型。


因此,如果您想直接注入(inject) ViewModel,您显然可以这样做,但您的 ViewModel 不会在方向更改之间保持其状态。

关于java - 在 Android - Dagger 2 中注入(inject) ViewModelFactory 有什么意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51562450/

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