lateinit 属性 mUserViewModel 尚未初始化
lateinit property mUserViewModel has not been initialized
我正在尝试读取我的数据库,因此我创建了一个编辑文本,我将在其中输入用户名和一个允许我搜索用户的按钮,但我在 class ListFragment : Fragment(), 上面写着 lateinit 属性 mUserViewModel 还没有初始化,请帮帮我 :(.
//实体
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int,
val firstName: String,
val lastName: String,
val age: Int
)
//道
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun addUser(user: User)
@Query("SELECT * FROM user_table where firstName LIKE :search LIMIT 1")
suspend fun readAllData(search : String) : User
}
//用户存储库
class UserRepository(private val userDao: UserDao) {
suspend fun readAllData(user: String):User{
return userDao.readAllData(user)
}
}
//用户视图模型
class UserViewModel(application: Application): AndroidViewModel(application) {
private lateinit var repository:UserRepository
fun search( search : String):User{
viewModelScope.launch {
repository.readAllData(search)
}
return search(String())
}
}
}
//class
class ListFragment : Fragment() {
//erro(lateinit property mUserViewModel has not been initialized)
lateinit var mUserViewModel:UserViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_list, container, false)
val name = view.editTextTextNameee.text.toString()
val prueba = mUserViewModel.search(name)
if (prueba!=null){
textView1.text = prueba.firstName
textView2.text = prueba.lastName
textView3.text = prueba.age.toString()
}else {
Toast.makeText(context, " Unregistered use", Toast.LENGTH_SHORT).show()
}
view.floatingActionButton.setOnClickListener {
findNavController().navigate(R.id.action_listFragment_to_addFragment)
}
return view
}
}
这很正常,因为你的 Dao return 一个 LiveData 所以当你观察这个数据时 return 值是一个列表,而不仅仅是一个用户。我不知道你想做什么。但是你必须:
mUserViewModel.searchResult.observe(viewLifecycleOwner, Observer {
textViewName.text = it.name
textViewLastName.text = it.lastname
textViewAge.text = it.age
})
您的查询将是:
@Query("SELECT * FROM user_table where name LIKE :search LIMIT 1")
suspend fun searchUser(search : String) : User
然后在您的 mUserViewModel 中创建一个值 searchResult 和一个方法 search:
fun search(val search : String){
viewModelScope.launch {
searchResult.postValue(dao.searchUser(search))
}
}
lateinit 未初始化的原因 属性 是您尚未创建 ViewModel 实例。你能试试这个吗
viewModel = ViewModelProvider(requireParentFragment(), factory).get(UserViewModel::class.java)
// 工厂将是视图模型的实例
您可以观察到实时数据更改 onviewCreated()
我正在尝试读取我的数据库,因此我创建了一个编辑文本,我将在其中输入用户名和一个允许我搜索用户的按钮,但我在 class ListFragment : Fragment(), 上面写着 lateinit 属性 mUserViewModel 还没有初始化,请帮帮我 :(.
//实体
@Entity(tableName = "user_table")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int,
val firstName: String,
val lastName: String,
val age: Int
)
//道
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun addUser(user: User)
@Query("SELECT * FROM user_table where firstName LIKE :search LIMIT 1")
suspend fun readAllData(search : String) : User
}
//用户存储库
class UserRepository(private val userDao: UserDao) {
suspend fun readAllData(user: String):User{
return userDao.readAllData(user)
}
}
//用户视图模型
class UserViewModel(application: Application): AndroidViewModel(application) {
private lateinit var repository:UserRepository
fun search( search : String):User{
viewModelScope.launch {
repository.readAllData(search)
}
return search(String())
}
}
}
//class
class ListFragment : Fragment() {
//erro(lateinit property mUserViewModel has not been initialized)
lateinit var mUserViewModel:UserViewModel
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_list, container, false)
val name = view.editTextTextNameee.text.toString()
val prueba = mUserViewModel.search(name)
if (prueba!=null){
textView1.text = prueba.firstName
textView2.text = prueba.lastName
textView3.text = prueba.age.toString()
}else {
Toast.makeText(context, " Unregistered use", Toast.LENGTH_SHORT).show()
}
view.floatingActionButton.setOnClickListener {
findNavController().navigate(R.id.action_listFragment_to_addFragment)
}
return view
}
}
这很正常,因为你的 Dao return 一个 LiveData 所以当你观察这个数据时 return 值是一个列表,而不仅仅是一个用户。我不知道你想做什么。但是你必须:
mUserViewModel.searchResult.observe(viewLifecycleOwner, Observer {
textViewName.text = it.name
textViewLastName.text = it.lastname
textViewAge.text = it.age
})
您的查询将是:
@Query("SELECT * FROM user_table where name LIKE :search LIMIT 1")
suspend fun searchUser(search : String) : User
然后在您的 mUserViewModel 中创建一个值 searchResult 和一个方法 search:
fun search(val search : String){
viewModelScope.launch {
searchResult.postValue(dao.searchUser(search))
}
}
lateinit 未初始化的原因 属性 是您尚未创建 ViewModel 实例。你能试试这个吗
viewModel = ViewModelProvider(requireParentFragment(), factory).get(UserViewModel::class.java)
// 工厂将是视图模型的实例
您可以观察到实时数据更改 onviewCreated()