如何在Jetpack Compose中用数据类中的字段填充TextViews



所以我参与的这个项目让我第一次使用Jetpack Compose来创建我的布局。所以我对这个还很陌生。我有一些数据类,它们从API中存储数据。ViewModel/LiveData也在使用中。我的问题是如何让TextView显示存储在数据模型中的数据?欢迎所有答案。非常感谢。

首先,通过viewModel()为屏幕创建一个ViewModel。例如

val myViewModel: MyViewModel = viewModel()

val myViewModel: MyViewModel = hiltViewModel()

DaggerHilt。(如果无法访问这些函数,请尝试为viewModel()添加androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1,为hiltViewModel()添加androidx.hilt:hilt-navigation-compose:1.0.0——请注意,这些版本可能已经过时(。

接下来,将存储库或UseCase传递或注入ViewModel的构造函数,并创建一个状态变量来保存和更新文本。

@HiltViewModel
class MyViewModel @Inject constructor(
private val myRepository: MyRepository
): ViewModel() {
var text by mutableStateOf("")
private set
fun setNewText(newText: String) {
text = newText
}
init {
viewModelScope.launch { // in case it's a suspend function
setNewText(myRepository.getDataClass().getText())
}
}
}

(对于mutableStateOfgetter和setter委派,需要导入androidx.compose.runtime.getValueandroidx.compose.runtime.setValue(。

最后,在Composable函数中创建Text,调用ViewModel并使用它更新新创建的文本。

@Composable
fun MyScreen(myViewModel: MyViewModel = hiltViewModel()) {
Text(
text = myViewModel.text,
modifier = Modifier.fillMaxWidth() // modify it as you wish
)
}

如果这不符合您的需求,请提供更多关于您情况的详细信息。此外,如果您对我向您展示的内容有任何疑问,我建议您查看文档。

我不知道您所描述的方法是从哪里得到的,但您需要的是状态提升。

基本原则可以在这里找到。这就是它的工作原理。

假设变量存储在视图模型中

var text by mutableStateOf("Initial Value Here") // Use 'by' to avoid writing '.value' every time

现在,您需要在viewModel中创建一个方法来更新此变量——任何希望修改此变量的代码都可以调用该方法。

var text by mutableStateOf("Initial Value Here")
fun updateText(newText: String){
text = newText
}

现在,在您的Composable中,创建两个参数——一个用于获取值,另一个用于设置值

@Composable
fun MyTextView(
text: Int,
onTextUpdate: (String) -> Unit // It accepts 'String' and returns 'Unit', like 'void' in java
){
TextField(
value = text, //Use the Value Here as a normal value,
onValueChange = onTextUpdate // Pass this as the updating function
)
}

在调用站点,传递viewModel的参数来连接状态提升节点,就像这样

setContent{
val viewmodel = ... //Initialize ViewModel Here
MyTextField(viewmodel.text, viewmodel::updateText)
}

差不多就是这样了。你只需要一个变量,修改它就可以完成所有繁重的工作——不需要像上面提到的那样处理多个变量。

考虑采用代码实验室

最新更新