Реализуйте Dagger во ViewModel, который вызывает другой класс - PullRequest
0 голосов
/ 27 апреля 2019

Это моя первая попытка применить кинжал в моем приложении, но я застрял в этом некоторое время.Я пытаюсь реализовать 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, но теперь я двигаюсь по кругу и буквально чувствую, что кинжал мне в сердце.

1 Ответ

0 голосов
/ 27 апреля 2019

У меня была эта проблема в прошлом. Я исправил это с помощью этого кода:

apply plugin: 'kotlin-kapt'

dependencies {
    def daggerVer = 2.22.1 // or latest version

    implementation "com.google.dagger:dagger:$daggerVer"
    implementation "com.google.dagger:dagger-android-support:$daggerVer"
    kapt "com.google.dagger:dagger-android-processor:$daggerVer"
    kapt "com.google.dagger:dagger-compiler:$daggerVer"
}

см. DaggerAppComponent не создан

...