This is my first attempt to try implement dagger in my app but I'm stuck at this for a while now. I'm trying to implement Dagger in a baby step here, so please bear with me.
Here's the current code of my app:
class Login : AppCompatActivity(), LifecycleOwner {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
private fun clickLogin() {
var loginViewModel = LoginViewModel()
loginViewModel = ViewModelProviders.of(this).get(LoginViewModel::class.java)
loginViewModel.getLoginObservable(params)!!.observe(this, Observer { myLoginSession ->
}
)
}
}
class LoginViewModel: ViewModel() {
private var loginObservable: LiveData<MyLoginSession>? = null
private var dbRepository: DbRepository? = null
fun getLoginObservable(params: Map<String, String>): LiveData<MyLoginSession>? {
dbRepository = DbRepository()
loginObservable = NetworkRepository.getInstance().login(userType, email, password)
return loginObservable
}
}
public class NetworkRepository {
private WebService webService;
private static NetworkRepository networkRepository;
private NetworkRepository(){
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(WebService.SERVER_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
webService = retrofit.create(WebService.class);
}
public synchronized static NetworkRepository getInstance(){
if (networkRepository == null){
networkRepository = new NetworkRepository();
}
return networkRepository;
}
public LiveData<MyLoginSession> login(int userType, String email, String password){
final MutableLiveData<MyLoginSession> data = new MutableLiveData<>();
HashMap<String, Object> params = new HashMap<>();
params.put("userType",userType);
params.put("email",email);
params.put("password",password);
webService.login(params).enqueue(new Callback<MyLoginSession>() {
@Override
public void onResponse(Call<MyLoginSession> call, Response<MyLoginSession> response) {
Log.v(TAG,"Response code: " + response.code());
}
@Override
public void onFailure(Call<MyLoginSession> call, Throwable t) {
data.setValue(null);
}
});
return data;
}
}
Now I'm trying to implement DI using Dagger for the function login under NetworkRepository first.
So I added these dependencies below first:
ext {
daggerVer = "2.22.1"
}
implementation "com.google.dagger:dagger:$daggerVer"
annotationProcessor "com.google.dagger:dagger-compiler:$daggerVer"
compileOnly 'javax.annotation:javax.annotation-api:1.3.2'
And created AppModule class as below:
@Module
public class AppModule {
@Provides
WebService providesWebService(){
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
return new Retrofit.Builder()
.baseUrl(WebService.SERVER_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(WebService.class);
}
}
And changed my NetworkRepository class to below:
@Singleton
public class NetworkRepository {
private WebService webService;
@Inject
private NetworkRepository(WebService webService){
this.webService = webService;
}
public LiveData<MyLoginSession> login(int userType, String email, String password){
final MutableLiveData<MyLoginSession> data = new MutableLiveData<>();
HashMap<String, Object> params = new HashMap<>();
params.put("userType",userType);
params.put("email",email);
params.put("password",password);
webService.login(params).enqueue(new Callback<MyLoginSession>() {
@Override
public void onResponse(Call<MyLoginSession> call, Response<MyLoginSession> response) {
Log.v(TAG,"Response code: " + response.code());
}
@Override
public void onFailure(Call<MyLoginSession> call, Throwable t) {
data.setValue(null);
}
});
return data;
}
}
And my LoginViewModel to
@Singleton
class LoginViewModel: ViewModel() {
@Inject lateinit var networkRepository: NetworkRepository
@Inject
fun getLoginObservable(params: Map<String,String>):LiveData<MyLoginSession>{
DaggerAppComponent.builder().build.buildWebService(this)
loginObservable = networkRepository.login(userType, email, password)
return loginObservable
}
}
If my code on trying to use Dagger above is confusing, it's most probably (obviously) because of the confusion that I faced while trying to implement Dagger in my app.. I went through tons of tutorial and while I faced little problem implementing Dagger in those tutorials' projects, it all went haywire when I tried to implement Dagger in my own app.
I can't compile the code above because it returns Unresolved reference: DaggerAppComponent
; this issue should be fixed after building the app but it doesn't, so I'm pretty sure there's other issue with my Dagger code.
I tried to backtrack and re-do the Dagger implementation several times but now I'm moving in a circle and I literally feels like putting a Dagger in my heart.