在ViewModel中实现Dagger,它调用另一个类

问题描述 投票:0回答:1

这是我在我的应用程序中尝试实现匕首的第一次尝试,但我现在已经坚持了一段时间。我正试图在这里实施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;
    }
}

现在,我正在尝试使用Dagger实现DI,首先在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实施,但现在我正在进行一个循环,我真的觉得像是把匕首放在心里。

android kotlin dagger-2
1个回答
0
投票

我过去遇到过这个问题。我用这个代码修复了它:

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 not created

© www.soinside.com 2019 - 2024. All rights reserved.