无法将数据分配给变量
Unable to assign data to a variable
我在将数据分配给变量 eventsString
时遇到问题。
我在协程中使用改造从网络加载数据,然后将加载的数据放入 eventsString
,但 eventsString
仍然有 12
。怎么了?
class OverviewViewModel: ViewModel() {
var eventsString: String = "12"
init {
getEventsFromNet()
println(eventsString) //here i get in comsole "12"
}
fun getEventsFromNet(){
viewModelScope.launch {
try {
eventsString = EventApi.retro.getEvents()
println(eventsString) //here i see in console loaded json, but at UI i still have "12"
}
catch (e: Exception){eventsString= "Failure: ${e.message}"}
}
}
}
我的改装服务
private const val BASE_URL = "https://api.spacexdata.com/v3/"
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(BASE_URL)
.build()
interface EventApiService{
@GET("launches")
suspend fun getEvents():String
}
object EventApi{
val retro :EventApiService by lazy {
retrofit.create(EventApiService::class.java)
}
}
在UI我用数据绑定来展示它:
android:text="@{viewModel.eventsString}"
LiveData 版本 - 同样的问题
class OverviewViewModel: ViewModel() {
//class OverviewViewModel(application: Application): AndroidViewModel(application) {
var _events = MutableLiveData<String>()
// val events : LiveData<String>
// get() = _events
var eventsString: String = "12"
init {
getEventsFromNet()
println(eventsString)
}
fun getEventsFromNet(){
viewModelScope.launch {
try {
_events = EventApi.retro.getEvents()
println("try")
println(eventsString)
}
catch (e: Exception){eventsString= "Failure: ${e.message}"}
}
}
}
改装服务
private const val BASE_URL = "https://api.spacexdata.com/v3/"//"https://jsonplaceholder.typicode.com/"
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(BASE_URL)
.build()
interface EventApiService{
@GET("launches") //"posts"
suspend fun getEvents():MutableLiveData<String>
}
object EventApi{
val retro :EventApiService by lazy {
retrofit.create(EventApiService::class.java)
}
}
改用LiveData.value = ...
。
- 视图模型
class OverviewViewModel: ViewModel() {
private val _events = MutableLiveData<String>()
val events get() = _events as LiveData<String>()
init {
getEventsFromNet()
}
fun getEventsFromNet(){
viewModelScope.launch {
_events.value = try { EventApi.retro.getEvents() }
catch (e: Exception) { "Failure: ${e.message}" }
}
}
- Fragment/Activity
// Fragment
// Specify the fragment view as the lifecycle owner of the binding.
// This is used so that the binding can observe LiveData updates
binding.lifecycleOwner = viewLifecycleOwner
// or Activity
binding.lifecycleOwner = this
- 布局
android:text="@{viewModel.events}"
您应该等待挂起函数完成获取数据,然后将数据赋值给变量。请检查下面的示例。
enter link description here
我在将数据分配给变量 eventsString
时遇到问题。
我在协程中使用改造从网络加载数据,然后将加载的数据放入 eventsString
,但 eventsString
仍然有 12
。怎么了?
class OverviewViewModel: ViewModel() {
var eventsString: String = "12"
init {
getEventsFromNet()
println(eventsString) //here i get in comsole "12"
}
fun getEventsFromNet(){
viewModelScope.launch {
try {
eventsString = EventApi.retro.getEvents()
println(eventsString) //here i see in console loaded json, but at UI i still have "12"
}
catch (e: Exception){eventsString= "Failure: ${e.message}"}
}
}
}
我的改装服务
private const val BASE_URL = "https://api.spacexdata.com/v3/"
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(BASE_URL)
.build()
interface EventApiService{
@GET("launches")
suspend fun getEvents():String
}
object EventApi{
val retro :EventApiService by lazy {
retrofit.create(EventApiService::class.java)
}
}
在UI我用数据绑定来展示它:
android:text="@{viewModel.eventsString}"
LiveData 版本 - 同样的问题
class OverviewViewModel: ViewModel() {
//class OverviewViewModel(application: Application): AndroidViewModel(application) {
var _events = MutableLiveData<String>()
// val events : LiveData<String>
// get() = _events
var eventsString: String = "12"
init {
getEventsFromNet()
println(eventsString)
}
fun getEventsFromNet(){
viewModelScope.launch {
try {
_events = EventApi.retro.getEvents()
println("try")
println(eventsString)
}
catch (e: Exception){eventsString= "Failure: ${e.message}"}
}
}
}
改装服务
private const val BASE_URL = "https://api.spacexdata.com/v3/"//"https://jsonplaceholder.typicode.com/"
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(ScalarsConverterFactory.create())
.baseUrl(BASE_URL)
.build()
interface EventApiService{
@GET("launches") //"posts"
suspend fun getEvents():MutableLiveData<String>
}
object EventApi{
val retro :EventApiService by lazy {
retrofit.create(EventApiService::class.java)
}
}
改用LiveData.value = ...
。
- 视图模型
class OverviewViewModel: ViewModel() {
private val _events = MutableLiveData<String>()
val events get() = _events as LiveData<String>()
init {
getEventsFromNet()
}
fun getEventsFromNet(){
viewModelScope.launch {
_events.value = try { EventApi.retro.getEvents() }
catch (e: Exception) { "Failure: ${e.message}" }
}
}
- Fragment/Activity
// Fragment
// Specify the fragment view as the lifecycle owner of the binding.
// This is used so that the binding can observe LiveData updates
binding.lifecycleOwner = viewLifecycleOwner
// or Activity
binding.lifecycleOwner = this
- 布局
android:text="@{viewModel.events}"
您应该等待挂起函数完成获取数据,然后将数据赋值给变量。请检查下面的示例。 enter link description here