根据http://konmik.github.io/snorkeling-with-dagger-2.html我可以添加
inject(Anything anything)
进入AppComponent.java,但在文章示例中,这对我不起作用:
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
void inject(MainActivity activity);
void inject(MainFragment fragment);
void inject(MainToolbarView view);
}
如果我尝试将依赖项注入我的片段,则注入的成员保持为空。我在这里错过了什么明显的错误?
相关来源:
ApplicationComponent.java
@Singleton
@Component(
modules = ApplicationModule.class
)
public interface ApplicationComponent {
void injectApplication(BaseApplication application);
Prefs providePrefs();
}
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
@AScope
@Component(
dependencies = {
ApplicationComponent.class
},
modules = ActivityModule.class
)
public interface ActivityComponent extends ApplicationComponent {
void injectActivity(BaseActivity activity);
void injectFragment(BaseFragment fragment);
}
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
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
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
public class BaseFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((BaseActivity)getActivity()).getComponent().injectFragment(this);
}
}
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;
}
}
ListFragmentPresenterImpl.java
public class ListFragmentPresenterImpl implements ListFragmentPresenter {
@Inject
public ListFragmentPresenterImpl() {
}
@Override
public String sayHello() {
return "hello";
}
}
在Dagger_ActivityComponent中,生成的代码如下所示:
@Override
public void injectActivity(BaseActivity activity) {
baseActivityMembersInjector.injectMembers(activity);
}
@Override
public void injectFragment(BaseFragment fragment) {
MembersInjectors.noOp().injectMembers(fragment);
}
这里不应该是baseFragmentMemebersInjector吗?
谢谢!
答案 0 :(得分:11)
注入子片段而不是BaseFragment
。在你的情况下:
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;
}
}
在你的Component类中:
@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);
}
父母 - &gt;儿童注射在Dagger 2中不起作用。它涵盖了here,here和this SO question。