从其他包中的 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¤t_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.
我一直在关注 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¤t_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.