У меня есть один MainActivity
с несколькими фрагментами, которые перемещаются через Navigation Component
. Моя цель — добавить в приложение несколько простых журналов, следуя учебнику Mixpanel.
Когда я создаю экземпляр микспанели, для которой требуется токен и контекст приложения, мне нужно иметь возможность передавать его по всем фрагментам, которые затем обрабатывают логику для onClick и других важных событий. Я не хочу создавать новые экземпляры mixpanel для каждого отдельного фрагмента, так как это может создать условия гонки между тем, как происходят события.
Я не использую Navigation Host программно. У меня есть BaseFragment
, что каждый из меньших подклассов фрагментов. Моя основная деятельность подразделяется на AppCompatActivity
.
Некоторые идеи,
- Объявить общедоступную переменную в MainActivity и сбросить ее из фрагментов. Проблема в том, что это тесно связывает основную деятельность с фрагментами, сводя к минимуму возможность повторного использования.
- Объявите mixpanel в качестве сопутствующего объекта в приложении. Это невозможно, так как для инициализатора Mixpanel требуется
applicationContext
. - Используйте SharedViewModel между всеми фрагментами, в которых хранится экземпляр mixpanel**. Проблема в том, что mixpanel не обязательно является объектом, который должен принадлежать модели представления; это скорее полезность, чем контент для представления.
- Передача данных через SafeArgs/NavController. Это должно работать, но это означает, что вы передаете эту переменную mixpanel из A в B, в C и т. д., что выглядит как шаблонный код и тесная связь.
- Передать данные во фрагмент после их захвата в
onAttachFragment(..)
Проблема, с которой я столкнулся, заключается в том, что мойMainActivity
на самом деле присоединяется к фрагменту NavigationHost, а не к моему фактическому фрагменту (или суперклассу BaseFragment).
Ни один из них не кажется правильным способом сделать это — какие-либо рекомендации?