无法将数据分配给变量

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