2017-07-19 96 views
4

我有一个类匕首2如何执行构造函数注入

public class DialogUtils 
{ 
    private Context context; 

    @Inject 
    public DialogUtils(Context context) 
    { 
     this.context = context; 
    } 
} 

在我的活动类我已经做了,但我发现在dialogUtils例如空指针异常。

public class LoginActivity extends Activity{ 
@Inject DialogUtils dialogUtils; 
} 

我知道如何通过模块和组件注入依赖关系,但不知道如何注入建筑。任何帮助深表感谢。

回答

3

如果不保留活性级组件,你是不是从一个超级作用域(应用程序级组件)使用组件依赖或子继承,那么它的下面

// unscoped 
public class DialogUtils { 
    private final Context context; 

    @Inject 
    public DialogUtils(Context context) { 
     this.context = context; 
    } 
} 

然后

@Module 
public class ActivityModule {  
    private final Context context; 

    public ActivityModule (Context context) { 
     this.context = context; 
    } 

    @Provides //scope is not necessary for parameters stored within the module 
    public Context context() { 
     return context; 
    } 
} 

@Component(modules={ActivityModule.class}) 
@Singleton 
public interface ActivityComponent { 
    Context context(); 

    DialogUtils dialogUtils(); 

    void inject(MainActivity mainActivity); 
} 

然后

@Inject 
DialogUtils dialogUtils; 

... 


    ActivityComponent activityComponent = DaggerMainActivityComponent.builder() 
     .activityModule(new ActivityModule(MainActivity.this)) 
     .build(); 

    activityComponent.inject(this); // activityComponent.dialogUtils() also works 
+0

谢谢。为什么我们也有这两个方法'Context context(); | DialogUtils dialogUtils();'当只有'void inject(MainActivity mainActivity);'可以达到目的吗? –

+0

你的方法给出了一个迹象表明,对于每一个活动,我必须做一个单独的组件和单独的模块?正确或我可以使用一些常用方法 –

+0

对话框需要一个活动上下文,但不应存储静态活动上下文。尽管如此,我可以让它更通用一些。 – EpicPandaForce

2

一方面,您注册构造函数注入DialogUtils,所以任何组件都可以提供它。

另一方面,Android框架的活动和其他部分仍然需要进行字段注入。匕首不能调用它们的构造函数,而@Inject DialogUtils dialogUtils;不会神奇地出现。

在这里,您必须使用一个组件,并注册一个将组件类型作为参数的方法。然后Dagger将创建注入活动字段的方法。

@Component MyComponent { 
    inject(LoginActivity activity); 
} 

要注入你还是要创建组件等领域,并调用inject(loginActivity)方法。

void onCreate(...) { 
    MyComponent component = // create the component 

    // dagger does some heavy lifting here 
    component.inject(this); 

    dialogUtils.doSomething(); // not null, we just injected our fields 
} 
+0

感谢您的回答。在你的例子中'MyComponent'不显示与DialogUtils的任何关系。那么如何调用'component.inject(this)'将注入'dialogUtils'变量。 –

+0

David您能否请我为我的问题展示一个完整的解决方案示例。另请参见构造函数@Inject public DialogUtils(Context context) this.context = context; }'即上下文将被注入?或者我怎么能提供,因为我的类不是一个模块,我只使用构造函数注入。请回复 –