#android #kotlin #dependency-injection #koin #koin-scope
Вопрос:
Я создаю приложение для устройства с несколькими дисплеями. Приложение должно быть доступно 2 разным пользователям одновременно и независимо. При совместном использовании одних и тех же данных они могут отличаться SharedPreferences
друг от друга, и приложение должно адаптироваться к потребностям каждого пользователя.
Это означает, что приложение будет работать в 2 разных MainActivity
экземплярах одновременно, и в зависимости от того, на каком дисплее они отображаются, мне нужно загрузить 2 разных SharedPreferences
файла. Я использую Koin
для внедрения зависимостей, и поскольку изнутри Koin Module
я не могу определить, для какого дисплея «нужна эта зависимость», я немного застрял.
Я думал о предоставлении уровня зависимости, но мой Preferences
класс активно используется в различных ViewModels
(которые подключены к различным фрагментам, которые подключены к одним из тех, MainActivity
Эс), классы репозитория или Service
S, и я не могу использовать scoped
зависимость в области одного или я получаю RuntimeException
, потому что Koin
не можете найти необходимых зависимостей для создания моего класса.
Я предоставляю свой Preferences
файл следующим образом:
class Preferences(private val sharedPreferences: SharedPreferences) {...}
Модуль Koin:
scopelt;MainActivitygt; { // this gets injected into MainActivity and will hold whether this instance // is from the main or from the secondary display. scoped { CalendarDisplayManager() } scopedlt;SharedPreferencesgt; { val isOnCoDriver = getlt;CalendarDisplayManagergt;().isMainDisplay val fileName = if (isOnCoDriver) "shared_preferences_main_display" else "shared_preferences_secondary_display" androidContext().getSharedPreferences(fileName, Context.MODE_PRIVATE) } }
Это решение на данный момент является неполным и не работает. Как я мог бы преодолеть эту проблему и отличить, когда мой Preferences
класс должен использоваться MainActivity
на основном дисплее или на дополнительном дисплее?