我正在阅读这个很棒的教程,解释了@Component.BuilderDagger 2中的工作方式.作者做得很好,文章很简单,但我仍需要澄清一些令人困惑的事情:Dagger 2的默认实现看起来像这样:
组件:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
SharedPreferences getSharedPrefs();
}
Run Code Online (Sandbox Code Playgroud)
模块:
@Module
public class AppModule {
Application application;
public AppModule(Application application) {
this.application = application;
}
@Provides
Application providesApplication() {
return application;
}
@Provides
@Singleton
public SharedPreferences providePreferences() {
return application.getSharedPreferences(DATA_STORE,
Context.MODE_PRIVATE);
}
}
Run Code Online (Sandbox Code Playgroud)
组件实例化:
DaggerAppComponent appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this)) //this : application
.build();
Run Code Online (Sandbox Code Playgroud)
根据文章,我们可以通过避免使用@Component.Builder和@BindsInstance注释向模块构造函数传递参数来进一步简化此代码,然后代码将如下所示:
组件:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent …Run Code Online (Sandbox Code Playgroud) 我正在我的项目中实施dagger 2.为此,我写了下面的代码行:
@Inject
VideoControllerView mediaController;
@Module
public class PlayerModule {
@Provides
VideoControllerView providesVideoControllerView(Context context, VideoControllerView.Controlers cntrls) {
return new VideoControllerView(context, cntrls);
}
}
@Component(modules = PlayerModule.class)
public interface PlayerComponent {
VideoControllerView getVideoControllerView();
}
Run Code Online (Sandbox Code Playgroud)
但是当我试图编译我的应用程序时,我得到的错误是:
Error:(14, 25) error: android.content.Context cannot be provided without an @Provides-annotated method.
android.content.Context is injected at
com.multitv.multitvplayersdk.module.PlayerModule.providesVideoControllerView(context, …)
com.multitv.multitvplayersdk.controls.VideoControllerView is provided at
com.multitv.multitvplayersdk.component.PlayerComponent.getVideoControllerView()
Run Code Online (Sandbox Code Playgroud)
我已经四处查看如何解决这个问题,但无济于事.请帮我.
我上课了
public class DialogUtils
{
private Context context;
@Inject
public DialogUtils(Context context)
{
this.context = context;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的活动类中,我已经做了但是我在dialogUtils实例上得到空指针异常.
public class LoginActivity extends Activity{
@Inject DialogUtils dialogUtils;
}
Run Code Online (Sandbox Code Playgroud)
我知道如何通过模块和组件注入依赖,但不知道如何使用构造注入.任何帮助深表感谢.
我需要能够从我的应用程序的主要活动之外调用readAsset.我听说有人提到需要传递Context,但语言一直很模糊.有人可以描述添加调用readAsset到不是主要活动的现有类的能力所需的步骤吗?在主活动中创建一个公共函数,并让其他调用不能作为我需要添加readAsset的地方,在一个单独的线程中.
我在资产文件夹中有一个 JSON 文件,而 DataManager(repository) 类需要它,因此资产管理器(和上下文)应该可以访问资产。
问题是基于最佳实践,Android 上下文或 android 特定代码不应该传递到数据层(ViewModel-Repo-Model),因为容易编写单元测试等,并且视图不应该直接与数据层交互。
我最终提供了使用列表并将其注入存储库。
这是正确的做法吗?
-谢谢
PS:我提供列表的模块类
@Module
public class UtilModule {
@Provides
@JsonScope
JsonUtil provideJsonUtil(AssetManager assetManager){
return new JsonUtil(assetManager);
}
@Provides
@JsonScope
String provideJson(JsonUtil util){
return util.getJson();
}
@Provides
@JsonScope
Type provideType(){
return new TypeToken<List<Data>>() {}.getType();
}
@Provides
@JsonScope
DataManager provideDataManager (Gson gson, Type type,String json) {
return new DataManager (gson.fromJson(json, type));
}
}
Run Code Online (Sandbox Code Playgroud)