没有@Inject构造函数或@Provides注释方法无法提供Android Dagger 2.11

时间:2018-08-04 07:47:29

标签: android exception dagger-2

在我的项目中,我使用 Salut 库来使用Wi-Fi Direct。下面是类的构造函数:

public Salut(SalutDataReceiver dataReceiver, 
             SalutServiceData salutServiceData, 
             SalutCallback deviceNotSupported) {
...
}

SalutDataReceiver类作为参数引用了活动。他还进行了回调。下面是类的构造函数:

public SalutDataReceiver(Activity activity, SalutDataCallback dataCallback) {
}

由于与活动之间存在严格的联系,因此我认为该对象应该从外部转移。下面是模块和组件的类:

@Module
public class WifiCommunicationModule {

    public WifiCommunicationModule() {

    }

    @Provides
    @Singleton
    public Salut provideSalut(SalutDataReceiver dataReceiver) {
        SalutServiceData serviceData = new SalutServiceData("testService", 50489, "test");
        return new Salut(dataReceiver, serviceData, null);
    }
}


 @Singleton
 @Component(modules = {
            AppModule.class,
            WifiCommunicationModule.class
    })
    public interface MainComponent {
        void inject(MainActivity activity);
    }


public class MainActivity extends AppCompatActivity {

    @Inject
    Salut salut;


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


    }
}

但是在编译时会抛出异常:

  

错误:(25,10)错误:com.peak.salut.SalutDataReceiver不能为   没有@Inject构造函数提供或从@Provides注释提供   方法。 com.peak.salut.SalutDataReceiver在以下位置注入   com.test.modules.WifiCommunicationModule.provideSalut(dataReceiver)   com.peak.salut.Salut被注入   com.test.views.activities.MainActivity.salut   com.test.views.activities.MainActivity在以下位置注入   com.test.components.MainComponent.inject(活动)

更新

先生。 @Zayniddin Mamarasulov建议您从SalutDataReceiver创建派生类,并将构造函数标记为@Inject。不幸的是,这也行不通

public class SalutDataReceiverExtension extends SalutDataReceiver {

    @Inject
    public SalutDataReceiverExtension(Activity activity, SalutDataCallback dataCallback) {
        super(activity, dataCallback);
    }
}


@Module
public class WifiCommunicationModule {

    public WifiCommunicationModule() {

    }

    @Provides
    @Singleton
    public Salut provideSalut(SalutDataReceiverExtension dataReceiver) {
        SalutServiceData serviceData = new SalutServiceData("testService", 50489, "test");
        return new Salut(dataReceiver, serviceData, null);
    }
}
  

错误:(25,10)错误:没有以下内容就无法提供android.app.Activity   @Inject构造函数或@Provides注释方法。   android.app.Activity被注入   com.test.implementation.SalutDataReceiverExtend。(活动,…)   com.test.implementation.SalutDataReceiverExtend在以下位置注入   com.test.modules.WifiCommunicationModule.provideSalut(dataReceiver)   com.peak.salut.Salut被注入   com.test.views.activities.MainActivity.salut   com.test.views.activities.MainActivity在以下位置注入   com.test.components.MainComponent.inject(活动)

1 个答案:

答案 0 :(得分:0)

像这样向SalutDataReceiver的构造函数添加@Inject注释:

printf '%s\n' "${files[@]}" # i.e. path/to/source/filename.tar.gz