从其他包中的 MainActivity 访问变量

Accessing variable from MainActivity in other packages

我一直在关注 documentation 为天气应用程序使用位置信息。我已按照 MainActivity 指定的说明进行操作,但想使用此位置信息进行 API 调用。

我在涉及 RetroFit2 和 Moshi 的 CodeLab 之后构建了我的应用程序。我已经声明了一个 network 包,并且正在其中包含的 ApiService class 中工作。如何从 ApiService 中访问 MainActivity 中定义的位置对象?

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()

有一些方法可以完成此操作。最简单的方法是在 MainActivityViewModel 上调用 API,这样您就可以将所需的所有信息作为参数发送。应该是这样的:

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)

    }

}

第二个(不要认为你会需要这个)是有一个带有这个位置数据的单例,并在你想要的 class 上获取它。您可以使用 Koin 注入这些 classes.