安卓:Dagger 2和构造函数注入

5

我是dagger的新手,我的构造函数 / 方法注入似乎不起作用。 不起作用意味着仍然请求注入的字段。

这是我的代码:

@Module
public class AppContextModule {

    private final Context appContext;

    public AppContextModule(Context appContext) {
        this.appContext = appContext;
    }

    @Singleton
    @Provides
    public Context getAppContext() {
        return appContext;
    }

}

@Singleton
@Component(modules = {AppContextModule.class})
public interface MyComponent {

    void inject(ActivitiesLifeCycleListener obj);

    void inject(WebViewManager obj);

    Context context();

}

public final class MyClass {

    private final WeakReference<Context> mAppContext;

    @Inject
    public MyClass(Context context)  {
        this.mAppContext = context
    }

}

public class MyActivity extends BaseActivity {

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

        MyClass my = new MyClass(); // The IDE requests context!

    }

}

尽管我在构造函数上方使用了“@Inject”注释,“MyClass”仍需要“Context”。我错过了什么?我是否需要公开我的Context?谢谢。

如果您要像这样创建实例“MyClass my = new MyClass();”,那么@inject还有什么意义? - eC Droid
1个回答

10

嗯...你声明了你的构造函数

public MyClass(Context context)  {
    this.mAppContext = context
}

然后不带任何参数调用它

MyClass my = new MyClass(); // The IDE requests context!

为什么你认为这样会起作用?这只是纯Java,没有涉及Dagger,并且你正试图创建一些新对象而没有提供所需的参数。


Dagger并不是一种改变Java工作方式的魔法。要使用构造函数注入,您必须实际上使用Dagger来注入您的字段。

public class MyActivity extends BaseActivity {

    @Inject
    MyClass mMyClass; // mark field for injection

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

        // todo ... create component

        component.inject(this); // inject fields
    }

}

假设您已经在某个地方提供了一个Context(如果没有,则会收到一个“必须提供上下文...”编译错误提示),那么Dagger将通过调用inject方法将MyClass注入到您的活动中——这并不是什么神奇的操作。该inject方法将把对象分配给您的字段。


构造函数注入只意味着您无需使用模块并包含提供对象的方法。它不能仅仅通过魔法从虚空中创建对象或更改构造函数的工作方式。


你能帮我解决这个问题吗?链接为http://stackoverflow.com/q/43308649/6596724,谢谢。 - tux-world
如果您能展示如何为非模块类制作组件,那就太好了。 - eC Droid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接