好吧,我是 android 和 kotlin 的初學者,所以我一直在嘗試將片段ViewCourses中的變數semi-selected發送到我的視圖模型 UserViewModel是代碼在下面。
`class ViewCourses(path: String) : ReplaceFragment() {
private var semesterSelected= path
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
container?.removeAllViews()
return inflater.inflate(R.layout.fragment_view_courses, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
userRecyclerView = view.findViewById(R.id.recyclerView)
userRecyclerView.layoutManager = LinearLayoutManager(context)
userRecyclerView.setHasFixedSize(true)
adapter = MyAdapter()
userRecyclerView.adapter = adapter
makeToast(semesterSelected)
// The variable I am trying to send to UserViewModel is -->> semesterSelected
var viewModel: UserViewModel = ViewModelProvider(this)[UserViewModel::class.java]
viewModel.allUsers.observe(viewLifecycleOwner) {
adapter.updateUserList(it)
}
}
}
class UserViewModel : ViewModel() {
private val repository: UserRepository = UserRepository("CSE/year3semester1").getInstance()
private val _allUsers = MutableLiveData<List<CourseData>>()
val allUsers: LiveData<List<CourseData>> = _allUsers
init {
repository.loadUsers(_allUsers)
}
}
我這樣做的原因是我希望從ViewCourses一直向我的存盤庫UserRepository發送一個變數,并認為通過UserViewModel發送它可能是一種方式。
class UserRepository(semesterSelected: String) {
// The variable I am expecting to get from UserViewModel
private var semesterSelected = semesterSelected
private val databaseReference: DatabaseReference =
FirebaseDatabase.getInstance().getReference("course-list/$semesterSelected")
@Volatile
private var INSTANCE: UserRepository? = null
fun getInstance(): UserRepository {
return INSTANCE ?: synchronized(this) {
val instance = UserRepository(semesterSelected)
INSTANCE = instance
instance
}
}
fun loadUsers(userList: MutableLiveData<List<CourseData>>) {
databaseReference.addValueEventListener(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
try {
val courseList: List<CourseData> = snapshot.children.map { dataSnapshot ->
dataSnapshot.getValue(CourseData::class.java)!!
}
userList.postValue(courseList)
} catch (e: Exception) {
}
}
override fun onCancelled(error: DatabaseError) {
}
})
}
}
我嘗試了類似下面的東西
class ViewCourses(path: String) : ReplaceFragment() {
private var semesterSelected= path
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
container?.removeAllViews()
return inflater.inflate(R.layout.fragment_view_courses, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
userRecyclerView = view.findViewById(R.id.recyclerView)
userRecyclerView.layoutManager = LinearLayoutManager(context)
userRecyclerView.setHasFixedSize(true)
adapter = MyAdapter()
userRecyclerView.adapter = adapter
makeToast(semesterSelected)
**// Sending the variable as parameter**
var viewModel: UserViewModel = ViewModelProvider(this)[UserViewModel(semesterSelected)::class.java]
viewModel.allUsers.observe(viewLifecycleOwner) {
adapter.updateUserList(it)
}
}
}
class UserViewModel(semesterSelected: String) : ViewModel() {
private val repository: UserRepository = UserRepository("CSE/year3semester1").getInstance()
private val _allUsers = MutableLiveData<List<CourseData>>()
val allUsers: LiveData<List<CourseData>> = _allUsers
init {
repository.loadUsers(_allUsers)
}
}
但是這樣做我的應用程式崩潰了。如何才能做到這一點 ?提前致謝。
uj5u.com熱心網友回復:
必須使用 ViewModelProvider.Factory 創建 ViewModel。但是如果您不指定一個,則會自動使用一個默認工廠。默認工廠可以創建具有以下建構式簽名之一的 ViewModel:
空的,例如
MyViewModel: ViewModel。保存狀態句柄,例如
MyViewModel(private val savedStateHandle: SavedStateHandle): ViewModel應用程式,例如
MyViewModel(application: Application): AndroidViewModel(application)兩者,例如
MyViewModel(application: Application, private val savedStateHandle: SavedStateHandle): AndroidViewModel(application)
如果您的建構式不匹配上述四個之一,您必須創建一個 ViewModelProvider.Factory 可以實體化您的 ViewModel 類并在指定您的 ViewModelProvider 時使用它。在 Kotlin 中,您可以使用by viewModels()更簡單的語法。有關如何創建 ViewModelFactory 的所有說明都在這里。
uj5u.com熱心網友回復:
var viewModel: UserViewModel = ViewModelProvider(this)[UserViewModel(semesterSelected)::class.java]
UserViewModel(semesterSelected)::class.javaNORUserViewModel::class.java是視圖模型的建構式。
如果您想擁有ViewModel該NEEDS初始引數,則必須為此創建自己的工廠-這有點復雜,對于您的情況,這對于您嘗試做的事情可能有點過頭了,但從長遠來看它將得到回報(VM 工廠入門)。
話雖如此,您的需求可以通過一個初始化視圖模型的函式輕松解決。
class UserViewModel() : ViewModel() {
private lateinit var repository: UserRepository
private val _allUsers = MutableLiveData<List<CourseData>>()
val allUsers: LiveData<List<CourseData>> = _allUsers
fun initialize(semesterSelected: String) {
repository = UserRepository("CSE/year3semester1").getInstance()
repository.loadUsers(_allUsers)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/529184.html
上一篇:在Kotlin中將List<Pair<K,Collection<V>>>轉換為Map<K,Collection<V>>
