如何保存ViewModel类中文本框中的用户输入



我通过以下教程在我的Journaling应用程序中构建了一个Room数据库。我已经使用数据绑定将ViewModel绑定到Fragment和XML布局文件。在我的ViewModel类中,我有一个onSave函数,它调用我的DAO插入函数。我设置了onclick监听器,这样当按下save按钮时,我的onSave函数就会在ViewModel中被调用。

但我的用户输入从未进入ViewModel,所以onSave什么都不保存。这是代码:

class TextEditorViewModel (val persistenceService: JournalEntryPersistenceService,
application: Application): AndroidViewModel(application) {
// This is for canceling coroutines when viewModel is destroyed
private var viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
private var journalEntry = MutableLiveData<JournalEntryDataClass?>()
init {
initializeJournalEntry()
}
fun onSave(entry: JournalEntryDataClass) {
uiScope.launch {
persistenceService.insert(entry)
}
}

class TextEditorFragment : Fragment() {
private lateinit var binding: TextEditorFragmentBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate(inflater, R.layout.text_editor_fragment, container, false)
val application = requireNotNull(this.activity).application
val persistenceService = JournalEntryDatabase.getInstance(application).journalEntryPersistenceService

val viewModelFactory = TextEditorViewModelFactory(persistenceService, application)
val textEditorViewModel = ViewModelProvider(this, viewModelFactory).get(TextEditorViewModel::class.java)
binding.setLifecycleOwner(this)
binding.textEditorViewModel = textEditorViewModel
var text = binding.journalEditTextBox.text.toString()
var journalEntry = JournalEntryDataClass(text)
binding.saveButton.setOnClickListener() { textEditorViewModel.onSave(journalEntry) }
return binding.root
}
}

现在,我已经意识到我的journalEditTextBox文本是在创建片段时分配的,因此没有数据。所以我本质上是在向onSave((函数发送一个空字符串。但我对如何做到这一点感到完全不知所措。

您需要在setOnClickListener中创建val文本。

binding.saveButton.setOnClickListener() { 
var text = binding.journalEditTextBox.text.toString()
var journalEntry = JournalEntryDataClass(text) 
textEditorViewModel.onSave(journalEntry) }

最新更新