java - Dagger 2 : error while getting a multiple instances of same object with @Named

标签 java android dependency-injection dagger

我怎样才能得到像游标一样返回类型相同的多个实例

例如:-

Module
@CursorScope
public class CursorModule {


    @Provides
    Cursor provideSongCursor(
            @Named("Song") Musician musician) {
        return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                new String[]{
                        BaseColumns._ID,
                        MediaStore.Audio.AudioColumns.TITLE,
                        MediaStore.Audio.AudioColumns.ARTIST,
                        MediaStore.Audio.AudioColumns.ALBUM,
                        MediaStore.Audio.AudioColumns.DURATION
                }, MediaStore.Audio.AudioColumns.IS_MUSIC + "=1", null, null);
    }

    @Provides
    Cursor provideAlbumCursor(
            @Named("Album") Musician musician) {
        return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
                new String[]{
                        BaseColumns._ID,
                        MediaStore.Audio.AlbumColumns.ALBUM,
                        MediaStore.Audio.AlbumColumns.ARTIST,
                        MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS,
                        MediaStore.Audio.AlbumColumns.FIRST_YEAR
                }, null, null, null);
    }

    @Provides
    Cursor provideArtistCursor(@Named("Artist") Musician musician) {
        return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
                new String[] {
                        BaseColumns._ID,
                        MediaStore.Audio.ArtistColumns.ARTIST,
                        MediaStore.Audio.ArtistColumns.NUMBER_OF_ALBUMS,
                        MediaStore.Audio.ArtistColumns.NUMBER_OF_TRACKS
                }, null, null,null);
    }

    @Provides
    Cursor provideGenreCursor(
            @Named("Genres") Musician musician) {
        return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI,
                new String[] {
                        BaseColumns._ID,
                        MediaStore.Audio.GenresColumns.NAME
                }, null, null, null);
    }

    @Provides
    Cursor providePlaylistCursor(@Named("Playlist") Musician musician) {
        return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
                new String[] {
                        BaseColumns._ID,
                        MediaStore.Audio.PlaylistsColumns.NAME
                }, null, null, null);
    }
}

中提供
@CursorScope
@Subcomponent(modules = CursorModule.class)
public interface CursorComponent {
    Cursor cursor();
}

我收到这个错误

Error:(17, 11) Gradle: error: android.database.Cursor is bound multiple times:
@Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.provideSongCursor(@Named("Song") com.merkmod.musician.application.Musician)
@Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.provideAlbumCursor(@Named("Album") com.merkmod.musician.application.Musician)
@Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.provideArtistCursor(@Named("Artist") com.merkmod.musician.application.Musician)
@Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.provideGenreCursor(@Named("Genres") com.merkmod.musician.application.Musician)
@Provides android.database.Cursor com.merkmod.musician.dependency.CursorModule.providePlaylistCursor(@Named("Playlist") com.merkmod.musician.application.Musician)

我制作了多个 Cursor 实例,并首先在提供者级别使用 @Named 进行注释,然后它开始给我错误,不能提供 @Provides 注释,所以我转而在构造函数中使用它

就像上面的代码一样。问题是一次又一次地运行一个循环,我就像被困在完成光标的事情上,我们将不胜感激。

最佳答案

当你想提供一种类型的多个变量时,你必须使用 @Named 注释,如下所示:

Module
@CursorScope
public class CursorModule {
@Provides
@Named("songCursor")
Cursor provideSongCursor(
        @Named("Song") Musician musician) {
    return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
            new String[]{
                    BaseColumns._ID,
                    MediaStore.Audio.AudioColumns.TITLE,
                    MediaStore.Audio.AudioColumns.ARTIST,
                    MediaStore.Audio.AudioColumns.ALBUM,
                    MediaStore.Audio.AudioColumns.DURATION
            }, MediaStore.Audio.AudioColumns.IS_MUSIC + "=1", null, null);
}

@Provides
@Named("albumCursor")
Cursor provideAlbumCursor(
        @Named("Album") Musician musician) {
    return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
            new String[]{
                    BaseColumns._ID,
                    MediaStore.Audio.AlbumColumns.ALBUM,
                    MediaStore.Audio.AlbumColumns.ARTIST,
                    MediaStore.Audio.AlbumColumns.NUMBER_OF_SONGS,
                    MediaStore.Audio.AlbumColumns.FIRST_YEAR
            }, null, null, null);
}
  @Provides
@Named("artistCursor")
Cursor provideArtistCursor(@Named("Artist") Musician musician) {
    return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
            new String[] {
                    BaseColumns._ID,
                    MediaStore.Audio.ArtistColumns.ARTIST,
                    MediaStore.Audio.ArtistColumns.NUMBER_OF_ALBUMS,
                    MediaStore.Audio.ArtistColumns.NUMBER_OF_TRACKS
            }, null, null,null);
}

@Provides
@Named("genreCursor")
Cursor provideGenreCursor(
        @Named("Genres") Musician musician) {
    return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Genres.EXTERNAL_CONTENT_URI,
            new String[] {
                    BaseColumns._ID,
                    MediaStore.Audio.GenresColumns.NAME
            }, null, null, null);
}

@Provides
@Named("playListCursor")
Cursor providePlaylistCursor(@Named("Playlist") Musician musician) {
    return musician.getApplicationContext().getContentResolver().query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
            new String[] {
                    BaseColumns._ID,
                    MediaStore.Audio.PlaylistsColumns.NAME
            }, null, null, null);
}


}

然后当你想注入(inject)时写如下:

@Inject
@Named("soundCursor")
Cursor soundCursor;

@Inject
@Named("albumCursor")
Cursor albumCursor;

@Inject
@Named("artistCursor")
Cursor artistCursor;

@Inject
@Named("genreCursor")
Cursor genreCursor;

@Inject
@Named("playListCursor")
Cursor playListCursor;

如果您想在构造函数注入(inject)中注入(inject)它们,请执行以下操作:

@Inject
public SomeClassConstructor(@Named("album") Cursor cursur)

以及您在子组件界面中所写的内容我无法理解它是什么,它一定是这样的:

@CursorScope
@Subcomponent(modules = CursorModule.class)
public interface CursorComponent {
   void inject(TheClassThatWantsToUseInject1 obj);
   void inject(TheClassThatWantsToUseInject2 obj);
}

在您的应用程序组件中:

   YourSubComponentInterface plus(CursorModule module);

关于java - Dagger 2 : error while getting a multiple instances of same object with @Named,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39932780/

相关文章:

c# - .NET 中未测试类的依赖注入(inject)

java - 如何从 Enum 中的 Spring Messagesource 读取内容?

java - Oracle ADF : How to populate DepartmentId value from managed backing or managed beans

android - 使用 setOnItemSelected 在 SharedPreferencies 中加载和保存 Spinner 选择

android - 缩放图像时出现问题

javascript - 将 angularjs 应用程序拆分为具有路由依赖项注入(inject)的组件

java - 无法在 Spring bean 中进行 self 注入(inject)?

java - 如何调用logback.xml文件中的application.properties值?

java - 有没有办法在 imageView 上实现重做和撤消

Android Activity 生命周期 - 通知服务