Dagger和Hilt初认识记录一下

65 阅读2分钟

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);
    }
    }
    

Using Dagger in Android apps

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 实现依赖项注入会发现简化过程

Dagger Hilt 的优点包括:
简单易用:Dagger Hilt 提供了一种简单的方式来管理依赖注入,无需编写大量的代码。
高效:Dagger Hilt 可以在编译时生成代码,因此可以提高应用程序的性能。
可扩展性:Dagger Hilt 可以与其他流行的库集成,因此可以轻松扩展应用程序的功能。
测试友好:Dagger Hilt 提供了一种简单的方式来测试应用程序中的依赖关系,因此可以提高测试的效率。
Dagger Hilt 的缺点包括:
学习曲线较高:Dagger Hilt 需要一定的学习成本,因为它涉及到一些概念,如依赖注入、接口等。
可能会增加编译时间:Dagger Hilt 会在编译时生成代码,因此可能会增加编译时间。