из одного модуля dagger2 как получить доступ к SharedPreferences из другого модуля dagger2 - PullRequest
0 голосов
/ 01 мая 2018

Имея SharedPreferences, предоставленные одним модулем dagger2, в другом модуле dagger2 хотели бы использовать его,
как это сделать?

приведенный ниже код не работает.

/ ** компонент * /

@Singleton
@Component(modules = arrayOf(DataManagerModule::class, 
                             AnotherModule::class))
interface DataManagerComponent {
    fun getDataManager() : DataManager
    fun getSharedPreferences() : SharedPreferences
}

/ ** модуль 1 * /

@Module
class DataManagerModule(@ApplicationContext private val appContext: Context) {

    @Singleton
    @Provides
    @ApplicationContext
    fun provideApplicationContext(): Context = appContext

    @Singleton
    @Provides
    fun provideSharedPreferences(): SharedPreferences {
        return appContext.getSharedPreferences(appContext.packageName, 
        Context.MODE_PRIVATE)
    }
}

/ ** модуль 2 * /

@Module
class AnotherModule(private val config1: String?, private val config2: Int?) {

    @Provides
    @Singleton
    internal fun provideClass2(context: Context): Class2 {

        if (config2 == null) {

            // how to get the preferences???
            // getSharedPreferences().edit().getInt(Constants.Settings, -1)

        }

        return class2(config1, config2, context)
    }
}

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Поскольку вы уже определили, как получить SharedPreferences из класса DataManagerModule, вы можете просто изменить

internal fun provideClass2(context: Context): Class2 {
       ...
}

до

internal fun provideClass2(sharedPreferences: SharedPreferences): Class2 {
       ...
}

Пусть другой класс расширит класс Application и объявит его для AndroidManifest следующим образом:

class App: Application() {

    lateinit var dataManagerComponent: DataManagerComponent

    override fun onCreate() {
        super.onCreate()

        dataManagerComponent = DaggerDataManagerComponent.builder()
                .dataManagerModule(DataManagerModule(this))
                .anotherModule(AnotherModule("config1", 123))
                .build()
    }
}

Измените ваш компонент, чтобы включить функцию ввода

@Singleton
@Component(modules = arrayOf(DataManagerModule::class,
        AnotherModule::class))
interface DataManagerComponent {
    fun getDataManager() : DataManager
    fun getSharedPreferences() : SharedPreferences
    // The activity/fragment you will need the values
    fun inject(target: MainActivity)
}

Затем введите его в действие

class MainActivity : AppCompatActivity() {

    @Inject lateinit var class2: Class2

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        (application as App).dataManagerComponent.inject(this)


        Log.i("CLASS2", class2.toString())
    }
}
0 голосов
/ 01 мая 2018

, поскольку все эти артефакты имеют одинаковую область видимости, а компонент создается с использованием обоих модулей, вы можете просто добавить SharedPreferences в качестве параметра к provideClass2(), чтобы использовать его при построении Class2 вот так:

@Provides
@Singleton
internal fun provideClass2(context: Context, prefs: SharedPreferences): Class2 {
    ...
}
...