Dagger和Hilt初认识记录一下
dagger是干什么的
简单理解就是做对象注解和实例化初始化一些需要的逻辑代码,省去对象创建和耦合过程
dagger集成
-
库导入
dependencies { // 如果使用的是 Java implementation 'com.google.dagger:dagger:2.50' annotationProcessor 'com.google.dagger:dagger-compiler:2.50' implementation "com.squareup.retrofit2:retrofit:2.9.0" }
-
Component注解接口创建
@Singleton // MyModule和NetworkModule要捆绑的注解模块 @Component(modules = {MyModule.class,NetworkModule.class}) public interface ApplicationComponent { //要注解的Activity配置 void inject(MyDaggerActivity loginActivity); }
-
MyModule注解模块创建
@Module public class MyModule { @Provides public String provideString() { return "Hello, Dagger!"; } }
-
NetworkModule注解模块创建
@Module public class NetworkModule { // @Provides tell Dagger how to create instances of the type that this function // returns (i.e. LoginRetrofitService). // Function parameters are the dependencies of this type. @Provides public LoginRetrofitService provideLoginRetrofitService() { // Whenever Dagger needs to provide an instance of type LoginRetrofitService, // this code (the one inside the @Provides method) is run. return new Retrofit.Builder() .baseUrl("https://example.com") .build() .create(LoginRetrofitService.class); } }
-
Retrofit LoginRetrofitService创建
public interface LoginRetrofitService { @GET("group/{id}/users") Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort); }
-
Application中初始化ApplicationComponent实例,不存在就尝试build rebuild project,生成了注解文件就有了 ``` public class MyApplication extends Application { ApplicationComponent appComponent = DaggerApplicationComponent.create(); @Override public void onCreate() { super.onCreate(); } }
-
在Activity中绑定调用
public class MyDaggerActivity extends AppCompatActivity { @Inject String string; @Inject LoginViewModel loginViewModel; @Override protected void onCreate(Bundle savedInstanceState) { ((MyApplication) getApplicationContext()).appComponent.inject(this); super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_dagger); TextView textView = findViewById(R.id.textView); textView.setText(string); textView.append("\n"+(loginViewModel!=null)); // userRepository.groupList(); } }
public class LoginViewModel { private final UserRepository userRepository; @Inject public LoginViewModel(UserRepository userRepository) { this.userRepository = userRepository; } public void groupList(int groupId,String sort){ userRepository.getUserRemoteDataSource().getLoginRetrofitService().groupList(groupId,sort); } }
dagger Hilt集成
- build.gradle.kts库导入
plugins { id("com.android.application") version "8.1.2" apply false id("com.google.dagger.hilt.android") version "2.50" apply false }
plugins { id("com.android.application") id("com.google.dagger.hilt.android") } dependencies { implementation("com.google.dagger:hilt-android:2.50") annotationProcessor("com.google.dagger:hilt-compiler:2.50") }
- Application初始化
@HiltAndroidApp public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); } }
- 创建一个注解对象
public class MyRepository { @Inject public MyRepository() {} public String getData() { return "Hello from MyRepository"; } }
- Activity注解以及调用
@AndroidEntryPoint public class MainActivity extends AppCompatActivity { @Inject MyRepository myRepository; public native String stringFromJNI(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView=findViewById(R.id.textView); if (myRepository!=null) { textView.append("\n"+myRepository.getData()); } } }
使用 Hilt 实现依赖项注入会发现简化过程