【问题标题】:Android Dagger 2.11 cannot be provided without an @Inject constructor or from an @Provides-annotated method没有@Inject 构造函数或@Provides-annotated 方法无法提供Android Dagger 2.11
【发布时间】:2019-01-11 23:52:17
【问题描述】:

在我的项目中,我使用 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);


    }
}

但在编译时抛出异常:

Error:(25, 10) error: com.peak.salut.SalutDataReceiver 不能 在没有 @Inject 构造函数或从 @Provides-annotated 的情况下提供 方法。 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);
    }
}

Error:(25, 10) error: 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(活动)

【问题讨论】:

    标签: android exception dagger-2


    【解决方案1】:

    像这样在 SalutDataReceiver 的构造函数中添加@Inject 注解:

    @Inject
    public SalutDataReceiver(Activity activity, SalutDataCallback dataCallback) {
    }
    

    【讨论】:

    • 这是一个外部库,我不能这样做
    • 你有没有尝试覆盖它的构造函数?
    • 尝试扩展 SalutDataReceiver 类并将@Inject 注解添加到您自己的类的构造函数中。我不能确切地说它有效,但它可能会帮助你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    相关资源
    最近更新 更多