簡體   English   中英

如何使用Dagger2將依賴項注入任何類型的對象?

[英]How to inject dependencies into any kind of object with Dagger2?

根據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);
}

如果我嘗試將依賴項注入到我的片段中,則注入的成員保持為null。 我在這里錯過了什么明顯的錯誤?

相關來源:

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?

謝謝!

注入子片段而不是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);
}

父母 - >兒童注射在Dagger 2中不起作用。 這里涉及 這里這是SO問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM