相关疑难解决方法(0)

了解Dagger 2 @ Component.Builder注释

我正在阅读这个很棒的教程,解释了@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)

android components dagger-2

11
推荐指数
2
解决办法
4088
查看次数

Dagger 2错误:如果没有@ Provide-annotated方法,则无法提供android.content.Context

我正在我的项目中实施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)

我已经四处查看如何解决这个问题,但无济于事.请帮我.

android dagger-2

10
推荐指数
2
解决办法
5661
查看次数

Dagger 2如何执行构造函数注入

我上课了

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)

我知道如何通过模块和组件注入依赖,但不知道如何使用构造注入.任何帮助深表感谢.

android dagger-2

9
推荐指数
1
解决办法
4888
查看次数

Android如何从主要活动之外读取资产

我需要能够从我的应用程序的主要活动之外调用readAsset.我听说有人提到需要传递Context,但语言一直很模糊.有人可以描述添加调用readAsset到不是主要活动的现有类的能力所需的步骤吗?在主活动中创建一个公共函数,并让其他调用不能作为我需要添加readAsset的地方,在一个单独的线程中.

android assets

5
推荐指数
1
解决办法
6034
查看次数

android中的MVVM,在不破坏模式的情况下访问assetManager

我在资产文件夹中有一个 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)

android android-assets android-mvvm

5
推荐指数
1
解决办法
3513
查看次数