【问题标题】:MVVM model - I can't find a bug that interferes with creating ViewModelMVVM 模型 - 我找不到干扰创建 ViewModel 的错误
【发布时间】:2020-05-26 07:19:58
【问题描述】:

我对视图模型有疑问。在活动“分析”中,我不得不破坏代码中的某些内容,但找不到错误。有人可以帮助我。我是Android程序的新手,我经常犯愚蠢的错误。到那时我会尝试找出错误。 非常感谢你的帮助 问候

DAO 包 com.example.mwproto1.ROOM

导入 androidx.lifecycle.LiveData 导入 androidx.room.*

@Dao
interface PomiarDao {

    @Insert
    suspend fun addPomiar(pomiar: Pomiar)

    @Query("SELECT * FROM pomiar ORDER BY id DESC")
    suspend fun getAllPomiar():List<Pomiar>

    @Insert
    suspend fun addMultiplePomiar(vararg pomiar: Pomiar)

    @Update
    suspend fun  updatePomiar(pomiar: Pomiar)

    @Delete
    suspend fun deletePomiar(pomiar: Pomiar )

    @Query("SELECT avg(Stezenie) FROM Pomiar ")
     fun average(): LiveData<Float>
}

存储库

package com.example.mwproto1.ROOM

import android.app.Application
import androidx.lifecycle.LiveData
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async

class Repository(application: Application) {


    private  var pomiardao: PomiarDao

    init {
        val database = Database
            .buildDatabase(application.applicationContext)
        pomiardao = database.getPomiarDao()

    }


    fun averageasync(): Deferred<LiveData<Float>> =
        CoroutineScope(Dispatchers.IO).async {
            pomiardao.average()
        }

}

视图模型

package com.example.mwproto1.ViewModel

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import com.example.mwproto1.ROOM.Pomiar
import com.example.mwproto1.ROOM.Repository
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.runBlocking

class ViewModel(application: Application):AndroidViewModel(application) {

    private var PomiarRepository: Repository = Repository(application)

    private var allpomiar: Deferred<LiveData<Float>> =
        PomiarRepository.averageasync()


    fun AverageVM(): LiveData<Float> = runBlocking {
        allpomiar.await()
    }
}

实体

package com.example.mwproto1.ROOM

import android.os.Parcel
import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

    @Entity
    data class Pomiar(
        @ColumnInfo(name="Stezenie")
        val Stezenie: String?,
        @ColumnInfo(name="Data")
        val Data: String?,
        @ColumnInfo(name="Zegar")
        val Zegar: String?,
        @ColumnInfo(name="Posilek")
        val Posilek: String?,
        @ColumnInfo(name="Samopoczucie")
        val Samopoczucie: String?,
        @ColumnInfo(name="Stres")
        val Stres: String?,
        @ColumnInfo(name="Hiperglikemia")
        val Hiperglikemia: String?

    ): Parcelable{
        @PrimaryKey(autoGenerate = true)
        var id :Int = 0

        constructor(parcel: Parcel) : this(
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString()
        ) {
            id = parcel.readInt()
        }

        override fun writeToParcel(parcel: Parcel, flags: Int) {
            parcel.writeString(Stezenie)
            parcel.writeString(Data)
            parcel.writeString(Zegar)
            parcel.writeString(Posilek)
            parcel.writeString(Samopoczucie)
            parcel.writeString(Stres)
            parcel.writeString(Hiperglikemia)
            parcel.writeInt(id)
        }

        override fun describeContents(): Int {
            return 0
        }

        companion object CREATOR : Parcelable.Creator<Pomiar> {
            override fun createFromParcel(parcel: Parcel): Pomiar {
                return Pomiar(parcel)
            }

            override fun newArray(size: Int): Array<Pomiar?> {
                return arrayOfNulls(size)
            }
        }
    }

ANALIZA-活动

package com.example.mwproto1

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.example.mwproto1.ROOM.Pomiar
import com.example.mwproto1.UI.PomiarAdapter
import kotlinx.android.synthetic.main.activity_analiza.*
import kotlin.properties.Delegates

public class Analiza : AppCompatActivity() {

    private lateinit var textView: TextView
    private lateinit var viewModel: ViewModel
    private lateinit var daoAdapter:PomiarAdapter
    private lateinit var pomiar: LiveData<Float>

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

        viewModel = ViewModelProvider.AndroidViewModelFactory.getInstance(application)
            .create(ViewModel::class.java)

        textView = findViewById(R.id.TV7)



        pomiar.observe(this,Observer {
            textView.setText(it.toString()) })
    }
}

错误

E/AndroidRuntime: 致命异常: main 进程:com.example.mwproto1,PID:11239 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.mwproto1/com.example.mwproto1.Analiza}: kotlin.UninitializedPropertyAccessException:lateinit 属性 pomiar 尚未初始化 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 引起:kotlin.UninitializedPropertyAccessException:lateinit 属性 pomiar 尚未初始化 在 com.example.mwproto1.Analiza.onCreate(Analiza.kt:34) 在 android.app.Activity.performCreate(Activity.java:7802) 在 android.app.Activity.performCreate(Activity.java:7791) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) I/Process:发送信号。 PID:11239 SIG:9 断开连接 目标虚拟机,地址:'localhost:8603',传输:'socket'

【问题讨论】:

  • 新错误,老我有空
  • 发布您的 viewModelFactory 代码并将您的 viewModel 类名重命名为 SharedViewModel 之类的其他名称,切勿将您的自定义类命名为现有类,这不是一个好习惯

标签: android database android-studio kotlin mvvm


【解决方案1】:

就像错误说的:“lateinit property pomiar has not been initialized”

您可能想要添加: pomiar = viewModel.AverageVM() 在 ANALIZA-ACTIVITY 中初始化 viewModel 后

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多