Android Kotlin 改造 MVVM return 空

Android Kotlin Retrofit MVVM return Null

我目前正在制作一个关于图表的示例项目。最近开始用MVVM架构,响应为null就卡住了。我还检查了可变实时数据以确保它正在调用 API。这是我的一些代码和错误标签:

Model.kt

data class Model(
    @SerializedName("FID") val FID: Int,
    @SerializedName("region") val region: String,
    @SerializedName("positive") val positive: Float
) {
}

ModelWrap.kt

data class ModelWrap(@SerializedName("samplesAPI") val attributes: Model){
}

ApiClient.kt

object ApiClient {
    var retrofitService: ApiInterface? = null
    const val BASE_URL = "https://sampleapi.../"

    fun getApiSample() : ApiInterface {
        if (retrofitService == null){
            val retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build()
            retrofitService = retrofit.create(ApiInterface::class.java)
        }
        return retrofitService!!
    }
}

ApiInterface.kt

interface ApiInterface {
    @GET("samples")
    fun getSampleData(): Call<List<ModelWrap>>
}

主视图Model.kt

class MainViewModelconstructor(private val repository: ModelRepository) : ViewModel(){
    val sampleList= MutableLiveData<List<ModelWrap>>()
    val errorMessage = MutableLiveData<String>()

    fun getSampleData(pieChart: PieChart){
        val response = repository.getSampleData()
        response.enqueue(object : Callback<List<ModelWrap>> {
            override fun onResponse(
                call: Call<List<ModelWrap>>,
                response: Response<List<ModelWrap>>
            ) {
                sampleList.postValue(response.body())
                
            }
            override fun onFailure(call: Call<List<ModelWrap>>, t: Throwable) {
                errorMessage.postValue(t.message)
            }

        })
    }
}

MainViewModelFactory.kt

class MainViewModelFactoryconstructor(private val repository: MainRepository) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return  if (modelClass.isAssignableFrom(MainViewModel::class.java)){
            MainViewModel(this.repository) as T
        } else {
            throw IllegalArgumentException("Sample ViewModel Not Found")
        }
    }
}

MainRepository.kt

class MainRepository constructor(private val retrofitService: ApiInterface){
    fun getSampleData() = retrofitService.getSampleData()
}

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var pieChart: PieChart

    lateinit var sampleViewModel: MainViewModel

    private val sampleService = ApiClient.getApiSample()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        pieChart = findViewById(R.id.PieChart)

        sampleViewModel= ViewModelProvider(this, MainViewModelFactory(MainRepository(sampleService))).get(MainViewModel::class.java)

        getPieChart(pieChart)

    }

    private fun getPieChart(pieCharts: PieChart) {
        mainViewModel.mainList.observe(this, Observer {
            Log.d("TAG sample" , "onCreate PieChart: $it")
Log.d("Tag Samples Response" , response.body().toString())
                    if (it != null) {
                        val sampleEntries: List<PieEntry> = ArrayList()
                        for ((attributes) in it!!) {
                            sampleEntries.toMutableList()
                                .add(PieEntry(attributes.positive, attributes.region))
    
        //........................................................................
    
                            val description = Description()
                            description.text = "Samples Data"
                            pieChart.description = description
                            pieChart.invalidate()
                        }
                    }
        })
        mainViewModel.errorMessage.observe(this, Observer {  })
        mainViewModel.getSampleData(pieCharts)
    }
}

最后,这里是一些日志消息:

V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo@8b795c0 nm : com.example.diargram ic=null
D/Tag Sample Response: null
D/TAG Sample: onCreate PieChart: null
E/libc: Access denied finding property "ro.serialno"
V/StudioTransport: Agent command stream started.
V/StudioTransport: Transport agent connected to daemon.

如果有人能帮助我,我将不胜感激:D,谢谢

最后,我找到了解决问题的方法:

  1. 我在界面中输入了错误的端点class,它应该是这样的:

interface ApiInterface { @GET("sample") fun getSampleData(): Call<List> }

  1. 在将实时数据分配给视图时,根据我的 JSON 我应该调用 ArrayList 而不是 List
  2. 列表项

之前:

val sampleEntries: List = ArrayList()

之后:

val sampleEntries: ArrayList<PieEntry> = ArrayList()