Как поделиться одним экземпляром объекта Mixpanel со всеми фрагментами в Kotlin при использовании непрограммного компонента навигации?

У меня есть один MainActivity с несколькими фрагментами, которые перемещаются через Navigation Component. Моя цель — добавить в приложение несколько простых журналов, следуя учебнику Mixpanel.

Когда я создаю экземпляр микспанели, для которой требуется токен и контекст приложения, мне нужно иметь возможность передавать его по всем фрагментам, которые затем обрабатывают логику для onClick и других важных событий. Я не хочу создавать новые экземпляры mixpanel для каждого отдельного фрагмента, так как это может создать условия гонки между тем, как происходят события.

Я не использую Navigation Host программно. У меня есть BaseFragment, что каждый из меньших подклассов фрагментов. Моя основная деятельность подразделяется на AppCompatActivity.

Некоторые идеи,

  1. Объявить общедоступную переменную в MainActivity и сбросить ее из фрагментов. Проблема в том, что это тесно связывает основную деятельность с фрагментами, сводя к минимуму возможность повторного использования.
  2. Объявите mixpanel в качестве сопутствующего объекта в приложении. Это невозможно, так как для инициализатора Mixpanel требуется applicationContext.
  3. Используйте SharedViewModel между всеми фрагментами, в которых хранится экземпляр mixpanel**. Проблема в том, что mixpanel не обязательно является объектом, который должен принадлежать модели представления; это скорее полезность, чем контент для представления.
  4. Передача данных через SafeArgs/NavController. Это должно работать, но это означает, что вы передаете эту переменную mixpanel из A в B, в C и т. д., что выглядит как шаблонный код и тесная связь.
  5. Передать данные во фрагмент после их захвата в onAttachFragment(..) Проблема, с которой я столкнулся, заключается в том, что мой MainActivity на самом деле присоединяется к фрагменту NavigationHost, а не к моему фактическому фрагменту (или суперклассу BaseFragment).

Ни один из них не кажется правильным способом сделать это — какие-либо рекомендации?


person Zorayr    schedule 05.11.2020    source источник