Android ||在 Hilt 不支持的 classes 中注入依赖项,例如 Helper class

Android || Inject dependencies in classes not supported by Hilt like Helper class

我在我的应用程序中使用了 Hilt,我在 Activity class 中成功注入了依赖项并获得了期望的结果,但无法在其他 [=44] 中注入依赖项=]就像助手 class.

请检查我在 MainActivity class

下面尝试过的代码
package com.inn.hiltdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

import com.inn.hiltdemo.hilt.MyFirstHelperClass;

import javax.inject.Inject;
import javax.inject.Named;

import dagger.hilt.android.AndroidEntryPoint;

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {


    @Inject
    @Named("MyHelperClass")
    MyFirstHelperClass myFirstHelperClass;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ////IT IS RUNNING SUCCESSFULLY
        System.out.println("HERE IS THE HELPER CLASS DATA==>>>> "+ myFirstHelperClass.getStringData());


        MySecondHelperClass mySecondHelperClass = new MySecondHelperClass();
        mySecondHelperClass.getSecondaryDataFromHelper(this);

    }
}

我的 我的模块 class

package com.inn.hiltdemo.hilt

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Named
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
class MyModule {

    @Singleton
    @Provides
    @Named("MyHelperClass")
    fun provideMyHelperClass(): MyFirstHelperClass {
        return MyFirstHelperClass()
    }
}

请检查 MyFirstHelperClass class

 package com.inn.hiltdemo.hilt;

public class MyFirstHelperClass {

    public String getStringData() {
        return "My Data";
    }
}

这是我的MySecondHelperClass.java,我试图在其中获取Hilt依赖注入,请检查下面的代码。

 package com.inn.hiltdemo;
    
    import android.content.Context;
    
    import com.inn.hiltdemo.hilt.MyFirstHelperClass;
    
    import javax.inject.Singleton;
    
    import dagger.hilt.EntryPoint;
    import dagger.hilt.InstallIn;
    import dagger.hilt.android.EntryPointAccessors;
    import dagger.hilt.components.SingletonComponent;
    
    @Singleton
    public class MySecondHelperClass {
    
    
        @EntryPoint
        @InstallIn(SingletonComponent.class)
        interface DeviceDiagnosticHelperEntryPoint {
            public MyFirstHelperClass provideMyFirstHelperClass();
        }
    
        public void getSecondaryDataFromHelper(Context mContext) {
    
            Context appContext = mContext.getApplicationContext();
            DeviceDiagnosticHelperEntryPoint hiltEntryPoint =
                    EntryPointAccessors.fromApplication(appContext,
                            DeviceDiagnosticHelperEntryPoint.class);
            MyFirstHelperClass myFirstHelperClass =
                    hiltEntryPoint.provideMyFirstHelperClass();
    
            System.out.println("HERE WE CAN USE==>>>> " + myFirstHelperClass.getStringData());
    
    
        }
    
    
    }

MySecondHelperClass.java 开始,我想在上面进行依赖注入 class 但是得到如下异常

[Dagger/MissingBinding] com.inn.hiltdemo.hilt.MyFirstHelperClass cannot be provided without an @Inject constructor or an @Provides-annotated method. com.inn.hiltdemo.hilt.MyFirstHelperClass is requested at com.inn.hiltdemo.MySecondHelperClass.DeviceDiagnosticHelperEntryPoint.provideMyFirstHelperClass()

您在第二个 Helper 中错过了 @Named 注释:

public class MySecondHelperClass {

   @EntryPoint
   @InstallIn(SingletonComponent.class)
   interface DeviceDiagnosticHelperEntryPoint {
       @Named("MyHelperClass")
       MyFirstHelperClass provideMyFirstHelperClass();
   }

   public void getSecondaryDataFromHelper(Context mContext) {

       Context appContext = mContext.getApplicationContext();
       DeviceDiagnosticHelperEntryPoint hiltEntryPoint =
               EntryPointAccessors.fromApplication(appContext,
                       DeviceDiagnosticHelperEntryPoint.class);
       MyFirstHelperClass myFirstHelperClass =
               hiltEntryPoint.provideMyFirstHelperClass();

       System.out.println("HERE WE CAN USE==>>>> " + 
       myFirstHelperClass.getStringData());
   }
}

第二个选项是使用注入注释 MyFirstHelperClass 的构造函数并完全删除模块 class(如果 MyFirstHelperClass 是你的)