Доступ к переменной из MainActivity в других пакетах

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

Я структурировал свое приложение после CodeLab с участием RetroFit2 и Moshi. Я объявил пакет network и работаю в содержащемся в нем классе ApiService. Как я могу получить доступ к объекту местоположения, определенному в MainActivity, изнутри ApiService?

com.example.app.MainActivity:

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
}

com.example.app.network.ApiService:

// how to access fusedLocationClient here?

private const val BASE_URL =
    "https://api.open-meteo.com/v1/forecast?latitude=52.52&longitude=13.41&current_weather=true"

private val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .build()

private val retrofit = Retrofit.Builder()
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .baseUrl(BASE_URL)
    .build()
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть несколько способов сделать это. Самый простой из них — использовать этот вызов API для MainActivityViewModel, чтобы вы могли отправлять в качестве параметра всю необходимую информацию. Это будет что-то вроде этого:

private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
     // ...
     fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)

     viewModel.makeCall(fusedLocationCient) 
}

И на viewModel

ViewModel: ViewModel() {

    fun makeCall(fusedLocationClient: LocationClient) {
        
        // I don't know how you created this ApiService, 
        // but you should access it here
        ApiService().makeCall(fusedLocationClient)

    }

}

Второй (не думаю, что вам это понадобится) - иметь синглтон с этими данными о местоположении и получить его в классе, который вы хотите. Вы можете использовать Koin для внедрения этих классов.

Другие вопросы по теме