如何注入依赖与Dagger2任何类型的对象? [英] How to inject dependencies into any kind of object with Dagger2?
问题描述
据<一href="http://konmik.github.io/snorkeling-with-dagger-2.html">http://konmik.github.io/snorkeling-with-dagger-2.html我只需要添加
inject(Anything anything)
进入AppComponent.java,但是这并没有为我工作,在文章的例子:
into AppComponent.java, but this doesn't work for me, in the articles example:
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(MainActivity activity);
void inject(MainFragment fragment);
void inject(MainToolbarView view);
}
如果我试图把依赖注入我的片段注入的成员仍然空。有什么明显的错误,我在这里丢失?
If I try to inject dependencies into my fragment the injected members remain null. What obvious error am I missing here?
有关人士透露:
ApplicationComponent.java
ApplicationComponent.java
@Singleton
@Component(
modules = ApplicationModule.class
)
public interface ApplicationComponent {
void injectApplication(BaseApplication application);
Prefs providePrefs();
}
ApplicationModule.java
ApplicationModule.java
@Module
public class ApplicationModule {
private final Application application;
public ApplicationModule(Application application) {
this.application = application;
}
@Provides
Application application() {
return application;
}
@Singleton
@Provides
Prefs providePrefs() {
return Prefs.with(application);
}
}
ActivityComponent.java
ActivityComponent.java
@AScope
@Component(
dependencies = {
ApplicationComponent.class
},
modules = ActivityModule.class
)
public interface ActivityComponent extends ApplicationComponent {
void injectActivity(BaseActivity activity);
void injectFragment(BaseFragment fragment);
}
ActivityModule.java
ActivityModule.java
@Module
public class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides
Activity activity() {
return activity;
}
@Provides
Context context() {
return activity;
}
}
BaseApplication.java
BaseApplication.java
public class BaseApplication extends Application {
private ApplicationComponent component;
@Override
public void onCreate() {
super.onCreate();
component = createComponent();
component.injectApplication(this);
}
private ApplicationComponent createComponent() {
return Dagger_ApplicationComponent.builder()
.applicationModule(new ApplicationModule(this))
.build();
}
public ApplicationComponent getComponent() {
return component;
}
}
BaseActivity.java
BaseActivity.java
public class BaseActivity extends ActionBarActivity implements HasComponent<ActivityComponent> {
ActivityComponent component;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
component = Dagger_ActivityComponent.builder()
.applicationComponent(((BaseApplication) getApplication()).getComponent())
.activityModule(new ActivityModule(this))
.build();
component.injectActivity(this);
}
@Override
public ActivityComponent getComponent() {
return component;
}
}
BaseFragment.java
BaseFragment.java
public class BaseFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BaseActivity)getActivity()).getComponent().injectFragment(this);
}
}
ListFragment.java
ListFragment.java
public class ListFragment extends BaseFragment {
@Inject ListFragmentPresenterImpl listFragmentPresenter;
public static ListFragment newInstance(){
ListFragment result = new ListFragment();
return result;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(R.layout.list_fragment, container, false);
Log.d("",listFragmentPresenter.sayHello()); // NPE HERE
return rootView;
}
}
ListFragment presenterImpl.java
ListFragmentPresenterImpl.java
public class ListFragmentPresenterImpl implements ListFragmentPresenter {
@Inject
public ListFragmentPresenterImpl() {
}
@Override
public String sayHello() {
return "hello";
}
}
在Dagger_ActivityComponent生成的code是这样的:
In Dagger_ActivityComponent the generated code looks like this:
@Override
public void injectActivity(BaseActivity activity) {
baseActivityMembersInjector.injectMembers(activity);
}
@Override
public void injectFragment(BaseFragment fragment) {
MembersInjectors.noOp().injectMembers(fragment);
}
不应该在这里是一个baseFragmentMemebersInjector?
shouldn't here be a baseFragmentMemebersInjector?
谢谢!
推荐答案
注入孩子的片段,而不是 BaseFragment
。你的情况:
Inject child fragments instead of BaseFragment
. In your case:
public class ListFragment extends BaseFragment {
@Inject ListFragmentPresenterImpl listFragmentPresenter;
public static ListFragment newInstance(){
ListFragment result = new ListFragment();
return result;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MainActivity)getActivity()).getComponent().injectFragment(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(R.layout.list_fragment, container, false);
Log.d("",listFragmentPresenter.sayHello()); // NPE HERE
return rootView;
}
}
和组件类中的:
@AScope
@Component(dependencies = ApplicationComponent.class,
modules = ActivityModule.class)
interface ActivityComponent {
void injectActivity(MainActivity activity);
void injectFragment(ListFragment fragment);
// Put any more injects here, if BaseFragment has
// any other children that need to be injected, for example:
void inject(MapFragment fragment);
void inject(DetailFragment fragment);
}
母公司 - 在这里覆盖的匕首2>儿童注射不工作,的here 和<一href="http://stackoverflow.com/questions/29312911/can-i-just-inject-super-class-when-use-dagger2-for-dependency-injection">this SO质疑。
这篇关于如何注入依赖与Dagger2任何类型的对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!