android - 出于某种原因,Dagger 没有构建模块

标签 android dependency-injection dagger-2

Here is我的简单应用程序(我国一家银行的移动客户端)。在我注入(inject) MapService 之前一切都很好服务MapActivity .我不明白为什么它不起作用,因为同样的事情对 MainActivity 非常有效与 MainService - 配置非常相似。

这是层次结构:

                      App
              ^                            ^
         MainActivity(may call Map)    MapActivity
            ^                ^       
     MainFragment      DepartmentFragment

这里是主要组件:

应用

public class App extends DaggerApplication {
    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().application(this).create(this);
    }
}

@Module
public abstract class ActivityBuilder {

    @Binds
    @IntoMap
    @ActivityKey(MapActivity.class)
    public abstract AndroidInjector.Factory<? extends Activity> bindMapActivity(MapActivityComponent.Builder builder);

    @Binds
    @IntoMap
    @ActivityKey(MainActivity.class)
    public abstract AndroidInjector.Factory<? extends Activity> bindMainActivity(MainActivityComponent.Builder builder);

}

@Component(modules = {
        AndroidInjectionModule.class,
        AppModule.class,
        ActivityBuilder.class
})
public interface AppComponent extends AndroidInjector<App> {
    @Component.Builder
    public abstract class Builder extends AndroidInjector.Builder<App> {
        @BindsInstance
        public abstract Builder application(Application application);
        public abstract AppComponent build();
    }
}

@Module(subcomponents = {
        MainActivityComponent.class,
        MapActivityComponent.class
})
public class AppModule {
    private static final String MTBANK_API_URL = "https://www.mtbank.by";
    @Provides
    public Context context(Application application) {
        return application;
    }
    @Provides
    public Retrofit xmlHttpAdapter() {
        return new Retrofit.Builder()
                .baseUrl(MTBANK_API_URL)
                .client(new OkHttpClient())
                .addConverterFactory(SimpleXmlConverterFactory.create())
                .build();
    }
    @Provides
    public MtbClient mtbClient(Retrofit retrofit) {
        return retrofit.create(MtbClient.class);
    }
}

map Activity

public class MapActivity extends DaggerActivity implements OnMapReadyCallback {
    @Inject
    MapService mapService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        ...
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
    ....
    }
}

@Subcomponent(modules = {MapActivityModule.class})
public interface MapActivityComponent extends AndroidInjector<MapActivity> {
    @Subcomponent.Builder
    public abstract class Builder extends AndroidInjector.Builder<MapActivity> {
    }
}

@Module
public abstract class MapActivityModule {
    @Provides
    MapService mapService() {
        return new MapService();
    }
}

主要 Activity

public class MainActivity extends DaggerActivity implements MainActivityContract.View, MainFragment.OnClickListener {

    @Inject
    MainService mapService;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
    }

    @Override
    public void onDepartmensClick() {
        ...
    }
}

@Subcomponent(modules = {MainActivityModule.class, MainFragmentsProvider.class})
public interface MainActivityComponent extends AndroidInjector<MainActivity> {

    @Subcomponent.Builder
    public abstract class Builder extends AndroidInjector.Builder<MainActivity> {
    }

}

@Module(subcomponents = {DepartmentFragmentComponent.class, MainFragmentComponent.class})
public abstract class MainActivityModule {
    @Provides
    public static MainService mapService() {
        return new MainService();
    }
}


@Module
public abstract class MainFragmentsProvider {

    @Binds
    @IntoMap
    @FragmentKey(DepartmentsFragment.class)
    public abstract AndroidInjector.Factory<? extends Fragment> bindDepartmentsFragment(DepartmentFragmentComponent.Builder builder);

    @Binds
    @IntoMap
    @FragmentKey(MainFragment.class)
    public abstract AndroidInjector.Factory<? extends Fragment> bindMainFragment(MainFragmentComponent.Builder builder);

}

public class MainPresenter implements MainActivityContract.Presenter {

    @Inject
    public MainPresenter() {

    }

}

public class MainService {
}

public interface MainActivityContract {

    interface View {
    }

    interface Presenter {
    }

}

主要 fragment

public class MainFragment extends DaggerFragment {
    public interface OnClickListener {
        void onDepartmensClick();
    }

    @BindView(R.id.departmens_button)
    Button departmensButton;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.main_activity_fragment, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        ButterKnife.bind(this, view);
        ...
    }
}

@Subcomponent(modules = {MainFragmentModule.class})
public interface MainFragmentComponent extends AndroidInjector<MainFragment> {
    @Subcomponent.Builder
    public abstract class Builder extends AndroidInjector.Builder<MainFragment> {
    }
}

@Module
public class MainFragmentModule {
}

部门 fragment

public class DepartmentsFragment extends DaggerFragment implements DepartmentFragmentContract.View {

    @Inject
Context context;

@Inject
DepartmentFragmentContract.Presenter presenter;

@Inject
DepartmentService departmentService;

@Override
public void onViewCreated(View fragment, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(fragment, savedInstanceState);
        ...
   }
}

@Subcomponent(modules = {DepartmentFragmentModule.class})
public interface DepartmentFragmentComponent extends AndroidInjector<DepartmentsFragment> {
    @Subcomponent.Builder
    public abstract class Builder extends AndroidInjector.Builder<DepartmentsFragment> {
    }
}

public interface DepartmentFragmentContract {
    interface View {
        void displayData(RateInfo rateInfo);
        void showMessage(String message);
        void displayDepartments(List<Department> departments);
        void fillInCities(List<String> cities);
        void showAtMap(Department department);
        void showDepartmentsRates(Department department);
    }

    interface Presenter {
        void loadRatesInfo();
        void showDepartmentLocation(Department department);
        void showDepartmentsRates(Department department);
        void filterDepartmentsByText(CharSequence text);
        void filterDepartmentsByCityId(int id);
        void resetCity();
    }
}

@Module
public class DepartmentFragmentModule {
    @Provides
    public DepartmentFragmentContract.View view(DepartmentsFragment fragment) {
        return fragment;
    }

    @Provides
    public DepartmentFragmentContract.Presenter presenter(DepartmentPresenter rateInfoPresenter) {
        return rateInfoPresenter;
    }

    @Provides
    public DepartmentService myService() {
        return new DepartmentService();
    }
}

public class DepartmentPresenter implements DepartmentFragmentContract.Presenter {

    private final DepartmentFragmentContract.View view;
    private final MtbClient mtbApi;

    @Inject
    public DepartmentPresenter(DepartmentFragmentContract.View view,
                               MtbClient mtbClient) {
        this.view = view;
        this.mtbApi = mtbClient;
    }

...

}

public class DepartmentService {
}

这是堆栈跟踪。我看到了错误消息,但不明白为什么会这样说。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.slesh.mtbbank/com.slesh.mtbbank.ui.map.MapActivity}: java.lang.IllegalStateException: com.slesh.mtbbank.ui.map.MapActivityModule must be set at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2449) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2509) at android.app.ActivityThread.access$1000(ActivityThread.java:153) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:5529) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) Caused by: java.lang.IllegalStateException: com.slesh.mtbbank.ui.map.MapActivityModule must be set at com.slesh.mtbbank.DaggerAppComponent$MapActivityComponentBuilder.build(DaggerAppComponent.java:220) at com.slesh.mtbbank.DaggerAppComponent$MapActivityComponentBuilder.build(DaggerAppComponent.java:211) at dagger.android.AndroidInjector$Builder.create(AndroidInjector.java:68) at dagger.android.DispatchingAndroidInjector.maybeInject(DispatchingAndroidInjector.java:79) at dagger.android.DispatchingAndroidInjector.inject(DispatchingAndroidInjector.java:104) at dagger.android.AndroidInjection.inject(AndroidInjection.java:61) at dagger.android.DaggerActivity.onCreate(DaggerActivity.java:36) at com.slesh.mtbbank.ui.map.MapActivity.onCreate(MapActivity.java:34) at android.app.Activity.performCreate(Activity.java:6303) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2402) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2509)  at android.app.ActivityThread.access$1000(ActivityThread.java:153)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1373)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:154)  at android.app.ActivityThread.main(ActivityThread.java:5529)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)

有人能帮帮我吗?

最佳答案

在您的 MapActivityModule.java 中。 将静态添加到 mapService()

@Module
public abstract class MapActivityModule {

    @Provides
    static MapService mapService() {
        return new MapService();
    }

}

关于android - 出于某种原因,Dagger 没有构建模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46566365/

相关文章:

asp.net-mvc - 将 MembershipProvider 注入(inject) ASP.NET MVC AccountController

Dagger 2 - 从多个独立作用域的组件注入(inject)到单个对象

android - 如何使用FirebaseUserMetadata检查新用户?

java - ListView - 具有自定义适配器的 ClickListener 删除项目触摸突出显示

java - 如何将 Spring bean 注入(inject)到 Exception 中

c# - 在哪里以及如何获得 Simple Injector 容器?

java - 字段 @Inject 在 Dagger2 中不起作用

dependency-injection - Dagger 2 : how to change provided dependencies at runtime

android - 通过Android中的声音启动服务?

android - 用作确认码的二维码