Я настроил проект, очень похожий на GithubBrowserSample
. Итак, установка кинжала такая же.
Учтите, что есть ActivityViewModel
и FragmentViewModel
, конструктор которых имеет ненулевой аргумент, поэтому они получаются из ViewModelProviders
через пользовательский ViewModelProvider.Factory
.
Я хочу дать указание кинжалу ввести уже созданный экземпляр ActivityViewModel
в следующем коде:
class FragmentViewModel @Inject constructor(
private val activityViewModel: ActivityViewModel
private val foo: Foo
) : ViewModel() {
...
}
С текущим объявлением Dagger создаст новый экземпляр ActivityViewModel
независимо от того, что он уже существует.
Это происходит потому, что существует аннотированный конструктор @Inject
для ActivityViewModel
.
Таким образом, dagger может предположить, что это правильный способ предоставления экземпляра ActivityViewModel
для FragmentViewModel
.
Я знаю, как делать вещи для обычного Даггера, но я не знаю, как это сделать для Даггера-Андроида, и это вопросы конкретно для настройки Даггера-Андроида.
В качестве грязного решения я сейчас вручную устанавливаю этот экземпляр:
class MyFragment : Fragment {
...
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this, viewModelFactory).get(FragmentViewModel::class.java)
viewModel.activityViewModel = ViewModelProviders.of(activity!!, viewModelFactory).get(ActivityViewModel::class.java)
}
...
}
Как правильно внедрить родительский ViewModel
в дочерний ViewModel
?
ViewModel
, потому что это не работа дочернегоViewModel
, то есть установление связи между фрагментами. - person azizbekian   schedule 11.08.2018ProgressBar
внутри вашей активности, которая в настоящее время скрыта. Теперь внутри вашего фрагмента вы выполняете действие, которое должно инициировать отображениеProgressBar
. Как вы собираетесь наладить это общение? - person azizbekian   schedule 11.08.2018findViewById()
?I would do it from fragment directly informing it's activity
Почему фрагмент должен знать что-то об иерархии представлений активности? - person azizbekian   schedule 11.08.2018It is just easier with databinding
Спасибо, я уже использую привязку данных, я просто имел в виду, что это не связано с фактическим вопросом. В моем случаеViewModel
ничего не знает ни о своем представлении, ни о помощнике другого представления. МойFragmentViewModel
делегирует заданиеActivityViewModel
, который, в свою очередь, отправляет событие в активность черезLiveData
. - person azizbekian   schedule 11.08.2018MAybe you could set a listener from activity to fragment's viewmodel after it's creation
Это именно то решение, которое я отметил в вопросе как грязное. Спасибо за мысли. - person azizbekian   schedule 11.08.2018It's exactly the solution that I've marked in the question as "dirty".
Нет, я предлагаю, чтобы ваша активность реализовывала какой-то интерфейс, скажем, ProgressBarListener. Во фрагменте onCreate устанавливает этот слушатель из активности в эту модель представления (если это событие не происходит из действия пользовательского интерфейса). По крайней мере, я бы так сделал. Надеюсь, это поможет. - person Deividas Strioga   schedule 11.08.2018