免责声明
这不是撰写的深入教程。我不会介绍您需要添加的依赖项,... - 您可以在这里找到Android Developers - Adding Jetpack Compose to your app。
这篇文章是对喷气背包的简短介绍,主要是关于它与其他UI框架不同的原因。
您可能已经猜到了,JetPack Compose是一个UI框架。它与Winforms,WPF,Swing,Tkinter等更常见的UI框架不同的是,它是声明性的UI框架。那是什么意思?简而言之:您声明了一个UI,仅此而已,您已经不在图片中。您不能像在非确定框架中一样与UI组件进行编程“交互”。
例如,如果您想通过单击按钮更改文本视图的文本,则您将在非决定性的UI框架中进行类似的操作。
StackPanel stackPanel = new StackPanel();
TextBox textBox = new TextBox();
stackPanel.Children.Add(textBox)
Button button = new Button();
stackPanel.Children.Add(button);
button.Click += (sender, ea) => { textBox.Text = "Button Pressed"; }
在这里,我们创建UI并直接与其他UI元素进行交互,我们可以更改它们的属性。这不起作用。尽管您可以继续引用组合物(UI组件),但您不能更改其属性。
val textComposable = Text(text = "Hello Compose.")
textComposable.text = "This won't compile, because there's no text property."
组合围绕单向数据流(UDF)模式设计。 UI触发事件,使您可以更改状态,从而触发UI的重新组件(〜重建/绘制UI)。
+---------------+
| UI |
+---------------+
| ^
event | | state
v |
+---------------+
| State |
+---------------+
仅使用了非定制的UI框架,该用例最有助于我理解如何思考作曲的方法是显示对话框。以下可合并函数确实可以做到这一点。
@Composable
fun SampleScreen() {
val showDialog = remember { mutableStateOf(false) } // changes to states trigger recomposition
TextButton(onClick = { showDialog.value = true }) {
Text(text = "Click to show the dialog")
}
if (showDialog.value) {
Dialog(onDismissRequest = { showDialog.value = false }) {
Text(text = "Tap outside the dialog to close it.")
}
}
}
这里发生了什么?首次将组合作用执行时,showDialog
变量设置为false
,因此我们不会将对话框添加到GUI中。如果我们单击该按钮并将showDialog
的值设置为true
,我们会触发合并的重组(B/C showDialog
是可变状态)。组合是“重新执行的”,这次围绕showDialog
是true
,我们显示对话框。
记住我
remember
允许一个可组合功能存储在内存中的信息,因此该信息在重新组件后仍可获得。
- 如果我们只写
val showDialog = mutableStateOf(false)
,则将重新组装UI,但是我们将将showDialog
重新定位为false
,因此不显示对话框。- 和kude11甚至不会触发重新组件,因此也没有对话。
而不是
remember
,我们也可以使用视图模型。
就是这样的简短介绍。
继续挣扎。