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.