Это моя первая попытка применить кинжал в моем приложении, но я застрял в этом некоторое время.Я пытаюсь реализовать Dagger на шаг впереди ребенка, поэтому, пожалуйста, потерпите меня.
Вот текущий код моего приложения:
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;
}
}
Теперь я пытаюсь реализовать DIсначала используя Dagger для входа в систему через NetworkRepository.
Итак, сначала я добавил следующие зависимости:
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'
И создал класс AppModule, как показано ниже:
@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);
}
}
Иизменил мой класс NetworkRepository на следующий:
@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;
}
}
И мой LoginViewModel на
@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
}
}
Если мой код при попытке использовать выше Dagger сбивает с толку, это, скорее всего (очевидно) из-запутаница, с которой я столкнулся, пытаясь реализовать Dagger в своем приложении. Я прошел через тонны учебников, и, хотя я столкнулся с небольшой проблемой при внедрении Dagger в проектах этих учебников, все пошло наперекосяк, когда я попытался реализовать Dagger в своем собственном приложении.
Я не могу скомпилировать код выше, потому что он возвращает Unresolved reference: DaggerAppComponent
;эта проблема должна быть исправлена после сборки приложения, но это не так, поэтому я почти уверен, что есть другая проблема с моим кодом Dagger.
Я несколько раз пытался откатить и повторить реализацию Dagger, но теперь я двигаюсь по кругу и буквально чувствую, что кинжал мне в сердце.