军备竞赛



5月,Google I / O 2019宣布了一个用于开发声明性Android UI的新框架,称为Jetpack Compose。 一个月后,在WWDC 2019上,宣布了一个名为SwiftUI的iOS声明式UI框架。 在这些会议之后,很清楚移动开发的目标是什么,我想弄清楚目前可以使用这些框架做什么以及它们之间的区别是什么。

课程复习


快速浏览后,很明显IOS的文档很不错。



并且完全缺乏android中的文档。 要熟悉官方页面上的框架,建议查看演示应用程序。


世界你好


SwiftUI的入门非常简单,只需将macOS升级到Beta,安装Xcode 11 Beta,然后创建一个新项目,同时选中“ Use SwiftUI”复选框。



对于Jetpack Compose,一切都更加复杂。 我们需要从Jetpack下载最新版本。 并基于ui-demos模块,通过键入来弄清楚如何使用该框架以及需要哪些依赖项。 与SwiftUI相比,Compose给人的第一印象非常可悲。



撰写范例

@Composable fun HelloWorld() { Text(text = "Hello world") } 

SwiftUI示例

 struct ContentView: View { var body: some View { Text("Hello SwiftUI!") } } 

UI的布局看起来非常相似,这是合乎逻辑的,因为它倾向于声明性的外观。

视觉编辑器


SwiftUi带有视觉编辑器(画布),
其中:

-更改代码后立即重绘屏幕;



-能够一次显示多个设备;



-可以从编辑器更改元素的属性ui;


-也是最有趣和最酷的-您可以从编辑器中运行ui代码,并查看屏幕的工作方式。


对于Jetpack Compose,没有可视化编辑器。

使用清单


要在SwiftUI中工作,只需创建字符串视图

 struct ListRow: View { let number:Int var body: some View { Text.init(verbatim: "Text \(number)") } } 

并粘贴到列表中。

  List(Array(0...44)) { number in ListRow.init(number: number) } 

清单已准备就绪。


Compose还没有列表小部件。 乍一看,您可以使用Column。

 Column { listOf( "", "", "", "", "", "", "", "", "" ) .forEach { name -> Text(text = name, style = +themeTextStyle { h2 }) } } 

但是他没有滚动。


最可悲的是,即使来自Google的示例尚未完成,也不会滚动。


视图层次


在SwiftUI中,替换UIViewController的根元素是具有新生命周期的新View组件。 这表明苹果公司已经分析了UIViewController实现的利弊,试图以一种新的方式来做所有事情,以实现最佳功能。

 struct ContentView : View { var body: some View { Text("ContentView2 ") .onDisappear(){ print("onDisappear") } .onAppear{ print("onAppear") } } } 

在Compose的情况下,根元素保留为良好的旧Activity或Fragment,而不是通常的XML加载。

 class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } 

从Compose下载小部件。

 class ComposeActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { CraneWrapper { MaterialTheme { Text(text = "Hello world") } } } } } 

这导致Android无法摆脱旧版根视图的事实。 只是旧的UI组件不再与XML通信,而是与Compose小部件通信。

导览


要在SwiftUI中导航,您必须通过单击按钮指定应打开哪个视图。

 NavigationButton(destination: LandmarkDetail()) { LandmarkRow(landmark: landmark) } 

Compose内部没有导航实现。 但是可能不应该这样,因为根元素是Activity或Fragment,在其中实施导航已有很长时间。

支持版本


SwiftUI可以在9月推出的iOS 13上使用,iPhone 5S,iPhone6,iPhone 6 Plus将不再支持它。 开发人员应考虑如何准备放弃这些模型。

Compose计划将在任何版本的Android上受支持。

结论


会议之后,我认为针对ui有两个新的强大框架。 结果,事实证明,苹果做出了一个很酷的决定,许多人对此做出了“提升”的决定。 谷歌宣布了一个过于粗糙的框架,以至于尚不清楚在概念层面上还能使用多少点。

Source: https://habr.com/ru/post/zh-CN456770/


All Articles