我刚开始使用Dagger 2,发现网上有成千上万的指南,每个指南都有不同的实现方法,现在我有些困惑。
目前我写的代码如下:
AppModule.java:
@Module
public class AppModule {
Application mApplication;
public AppModule(Application application) {
mApplication = application;
}
@Provides
@Singleton
Application providesApplication() {
return mApplication;
}
}
DataModule.java:
数据模块。@Module
public class DataModule {
private static final String BASE_URL = "http://beta.fridgewizard.com:9001/api/";
@Provides
@Singleton
NetworkService provideNetworkService() {
return new NetworkService(BASE_URL);
}
@Provides
@Singleton
SharedPreferences provideSharedPreferences(Application app) {
return PreferenceManager.getDefaultSharedPreferences(app);
}
}
PrefsModel.java:
@Module(includes = DataModule.class)
public class PrefsModel {
@Provides
@Singleton
QueryPreferences provideQuery(SharedPreferences prefs) {
return new QueryPreferences(prefs);
}
}
AppComponent.java(我将QueryPreferences对象公开,因为我在Presenter中需要它,希望这样是正确的):
AppComponent.java(我将QueryPreferences对象公开,因为我在Presenter中需要它,希望这样是正确的):
@Singleton
@Component(modules = {AppModule.class, DataModule.class, PrefsModel.class})
public interface AppComponent {
void inject(HomeFragment homeFragment);
QueryPreferences preferences();
NetworkService networkService();
}
然后我有FwApplication.java文件:
public class FwApplication extends Application {
private static final String TAG = "FwApplication";
private NetworkService mNetworkService;
private AppComponent mDataComponent;
@Override
public void onCreate() {
super.onCreate();
buildComponentAndInject();
}
public static AppComponent component(Context context) {
return ((FwApplication) context.getApplicationContext()).mDataComponent;
}
public void buildComponentAndInject() {
mDataComponent = DaggerComponentInitializer.init(this);
}
public static final class DaggerComponentInitializer {
public static AppComponent init(FwApplication app) {
return DaggerAppComponent.builder()
.appModule(new AppModule(app))
.dataModule(new DataModule())
.build();
}
}
}
最后,我为演讲者添加了另一个模块:
@Module
public class PresenterModule {
@Provides
Presenter<FwView> provideHomePresenter(NetworkService networkService) {
return new HomePresenterImpl(networkService);
}
@Provides
Presenter<FwView> provideSearchPresenter(NetworkService networkService) {
return new SearchPresenterImpl(networkService);
}
}
以下组件返回错误,因为我无法在此添加作用域依赖项:
@Component(dependencies = AppComponent.class, modules = PresenterModule.class)
public interface PresenterComponent {
void inject(HomePresenterImpl presenter);
}
所以,我在阅读在线文档时有几个问题不太清楚:
- 由于 Presenter 组件依赖于 NetworkService(在 AppComponent 中定义的单例),我该如何修复错误?
- 我有一个 HomeFragment,应该使用“new HomePresenter(networkService)”来实现 HomePresenter,但现在我不知道如何使用 DI(依赖注入)定义
编辑 - 修复:
HomeFragment.java:
public class HomeFragment extends Fragment {
private static final String TAG = "FW.HomeFragment";
@Inject
HomePresenterImpl mHomePresenter;
public static HomeFragment newInstance() {
return new HomeFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FwApplication.component(getActivity()).inject(this);
}
然后我以这种方式修改了主持人构造函数:
@Inject
public HomePresenterImpl(NetworkService networkService) {
mNetworkService = networkService;
mInteractor = new InteractorImpl(mNetworkService);
}
然后NetworkService会自动注入。
我想知道这种方式是否正确,因为我不得不为每个需要以与上面相同的方式构建presenter的片段调用以下代码:
FwApplication.component(getActivity()).inject(this);
onCreate()
中使用getAactivity()
可能会产生NullPointerException
。https://dev59.com/eG025IYBdhLWcg3wHR4Y#6225044 - Bresiu