Что не так с использованием инсталляции setter для Android ViewModel против внедрения и ввода ViewModel.Factory?

Я изо всех сил пытаюсь получить синглтон Кинжал, введенный в компонент Android (Service) и ViewModel.

См. Этот вопрос в качестве справки. Я не нашел хороший пример того, как просто вставить поле в Сервис и поле в ViewModel с тем же объектом. Если есть простое решение, которое я хотел бы увидеть.

Я нашел несколько вопросов, здесь и здесь , которые имеют ответы, которые идут по пути реализации ViewModel.Factory, а затем вводят зависимости в конструктор подкласса ViewModel, который имеет зависимости через метод create.

Мой вопрос. Существуют ли какие-либо серьезные проблемы с простое вложение объекта в Activity (и Сервис), а затем с помощью установщика для инъекции объекта в ViewModel после его восстановления? Например.

class MainActivity : AppCompatActivity() { @Inject lateinit var messageBus: MessageBus // "thing" I want in the ViewModel override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) // get the ViewModel val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) // inject the "thing" via a setter viewModel.messageBus = messageBus } } 

В представлении класса MainViewModel я мог проверить, установлено ли это значение уже и только установить его, если оно равно null.

 class MainViewModel: ViewModel() { var messageBus: MessageBus? = null set(value) { if (field == null) { field = value // do initialization stuff } } } 

Я вижу это как маленький взлом, но не вредный взлом. Мне нравится идея предоставить ViewModelFactory с помощью кинжала вместе со всеми зависимостями, необходимыми для его функционирования, а затем вставлять их в активность, чтобы вы могли передать ее в метод of(FragmentActivity activity, ViewModelProvider.Factory factory) . Это позволяет избежать изменчивости этого свойства.

Intereting Posts
Как использовать обработанную Kotlin оболочку MailChimp в Java Project Имеет ли Kotlin стандартный способ форматирования числа в качестве английского ординала? Является ли я единственным автоответчиком IDEA, который не работает в Котлине? Могу ли я написать sampleVideoView? = findViewById <VideoView> (R.id.videoView) в Котлине? Предотвратите, чтобы Kotlin заставлял Java видеть тип подстановочного знака Google Guava Invokedynamic требует –min-sdk-version> = 26 Spring Boot не запускает автозагрузчик при использовании @Cacheable Как добавить тестовые переопределения в график зависимостей по умолчанию? Заголовки HTTP не возвращаются на EC2 JSON для HashMap с объектами с использованием Gson RxAndroid – обращение к ошибкам с помощью оператора Zip Kotlin Decompiler генерирует ошибочный код – можно ли предотвратить? Любая разница между «Subject.asObservable ()» и самим предметом «Тема»? динамически созданный текст, как сделать findViewByTag в kotlin, он показывает неразрешенные ссылки Имя файла, имя каталога или синтаксис метки тома неверны – Kotlin – Maven