这是我在我的应用程序中尝试实现匕首的第一次尝试,但我现在已经坚持了一段时间。我正试图在这里实施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实施,但现在我正在进行一个循环,我真的觉得像是把匕首放在心里。
我过去遇到过这个问题。我用这个代码修复了它:
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"
}