2016-05-16 64 views
5

我是新来的匕首,我的构造函数/方法注入似乎不工作。 不起作用,意味着仍然要求注入字段。Android:匕首2和构造函数注入

这是我的代码:

@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! 

    } 

} 

“MyClass的”仍然需要“上下文”虽然我使用了构造上面的“@Inject”的注释。 我错过了什么?

我甚至需要暴露我的上下文吗?

感谢。

+0

如果你打算创建MyClass my = new MyClass();'这样的话,@inject有什么意义? –

回答

10

嗯......你宣布你的构造

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

然后调用它不带任何参数

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

为什么你认为这应该工作?这是纯java,不涉及匕首,并且您正在尝试创建一些新对象而不提供所需的参数。


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地方(你会得到一个Context must be provided...编译错误,如果它是不是),那么匕首将调用inject —没有神奇的注入与MyClass您的活动。 inject方法会将对象分配给您的字段。


构造函数注入只意味着你不必使用一个模块,并包含一个方法来提供对象。它不仅仅是通过神奇的方式创造出令人难以置信的对象,或者改变建设者的工作方式。

+0

你能帮我关于这个话题吗?http://stackoverflow.com/q/43308649/6596724,谢谢 –

+0

如果你已经展示了如何制作一个不是模块的类的组件, –