DaggerViewModel

Additional

Language
Kotlin
Version
N/A
Created
Sep 17, 2017
Updated
Mar 4, 2018
Owner
Alex Facciorusso (alexfacciorusso)
Contributor
Alex Facciorusso (alexfacciorusso)
1
Activity
Badge
Generate
Download
Source code
APK file

Commercial

DaggerViewModel

An integration Module for injecting Google Architecture Components' ViewModel into Dagger2-injected Android activities and fragments.

This library was inspired by the official GithubBrowserSample example.

Installation

Add one of the following lines depending to your Gradle Android plugin version in your dependencies section:

// For plugin version < 3.x
compile 'com.alexfacciorusso:daggerviewmodel:0.1.2'

// For plugin version >= 3.x
implementation 'com.alexfacciorusso:daggerviewmodel:0.1.2'

Usage

Install the library, then bind your ViewModels into an abstract @Module-annotated class annotating your binding method with @IntoMap and @ViewModelKey, giving to the latter annotation your custom ViewModel class as parameter. For example:

 @Module
 abstract class ViewModelModule {
     @Binds
     @IntoMap
     @ViewModelKey(MyViewModel::class)
     abstract fun bindsMainViewModel(myViewModel: MyViewModel): ViewModel
     
     // other binds...
 }

Add the DaggerViewModelModule and the module containing your ViewModels (in our example ViewModelModule) to your Application Component:

Kotlin

@Singleton
@Component(modules = arrayOf(AndroidSupportInjectionModule::class, DaggerViewModelInjectionModule::class,
        your other modules...))
interface ApplicationComponent {
    // your component definitions ...
}

Java

@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, DaggerViewModelInjectionModule.class, 
    your other modules...})
public interface ApplicationComponent {
    // your component definitions ...
}

And finally you can @Inject a ViewModelProvider.Factory into your Activity/Fragment and use it to create your ViewModel.

Kotlin

class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory
    
    private lateinit var viewModel: MyViewModel
    
    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        
        setContentView(R.layout.activity_main)
        viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
        
        // ...
    }
    
    // ...
}

Java

public class MainActivity extends AppCompatActivity {
    @Inject
    ViewModelProvider.Factory viewModelFactory;
        
    private MyViewModel viewModel;
    
    
    void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.activity_main);
        viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel.class);
        
        // ...
    }
    
    // ...
}

License

Copyright 2017 Alex Facciorusso.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.