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/