如何解决Android 双向数据绑定可以在没有样板的情况下与 Room 一起使用吗?
据我所知,Room 可用于双向数据绑定,但我找不到没有大量样板的工作代码示例。大多数示例使用 Room 的内容填充列表并通过按钮与其交互,而不是使用双向数据绑定。
项目简介:
-
SettingsModel
的 5 个属性应该被显示并被 可在EditText
的 5 - 无需手动点击按钮即可保存更改
settings_fragment.xml
秒内编辑
什么有效:
- 正在使用正确的
EditText
值初始化SettingsModel()
(因此至少单向绑定似乎有效)
什么不起作用:
- 编辑
EditText
不会自动更新 Room,尽管绑定是双向数据绑定 - 手动保存也不起作用,因为解决方法保存按钮无法访问
settings
,因为它是LiveData<SettingsModel>
并且存储库需要SettingsModel
SettingsModel
、SettingsDao
和 MainRepository
:(存储库模式)
@Entity(tableName = "settings")
data class SettingsModel(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,var games: String = "",var streamers: String = "",var title: String = "",var tag: String = "",var languageCode: String = ""
)
@Dao
interface SettingsDao {
@Query("SELECT * FROM settings LIMIT 1")
fun getFirstSettings(): LiveData<SettingsModel>
@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun update(settings: SettingsModel)
}
class MainRepository @Inject constructor(
private val appDatabase: SettingsDao
) {
fun getSettings() = appDatabase.getFirstSettings()
suspend fun updateSettings(settings: SettingsModel) = appDatabase.update(settings)
}
settings_fragment.xml
、SettingsFragment
和 SettingsViewModel
:(MVVM)
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="viewModel"
type="….SettingsViewModel" />
</data>
…
<EditText
android:id="@+id/editTextTextMultiLine6"
android:layout_width="0dp"
android:layout_height="150dp"
android:ems="10"
android:gravity="start|top"
android:inputType="textMultiLine"
android:text="@={viewModel.settings.games}"
… />
…
</layout>
@AndroidEntryPoint
class SettingsFragment : Fragment() {
private val viewModel: SettingsViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View {
val binding: SettingsFragmentBinding = DataBindingUtil.inflate(
inflater,R.layout.settings_fragment,container,false
)
binding.viewModel = viewModel
return binding.root
}
}
@HiltViewModel
class SettingsViewModel @Inject constructor(
private val repository: MainRepository
) : ViewModel() {
var settings = repository.getSettings()
fun saveSettings() {
GlobalScope.launch(Dispatchers.Main) {
// repository.updateSettings(settings.value)
//
// Type mismatch.
// Required: SettingsModel
// Found: LiveData<SettingsModel>
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。