这是我参加8月更文应战的第2天,活动概略检查:8月更文应战

7月底 Compose for Android 1.0 刚刚发布,紧接着 8月4日 JetBrains 就宣告了 Compose Multiplatform 的最新进展,现在已进入 alswiftui编程pha 阶段。

Compose 作为一个swiftui编程声明式UI结构,除了烘托数据库原理部分需凭仗途径才jetbrains什么意思能以外,其他大部分特性能够做到途径无关。尤其是 Kotlin 这样一门跨途径言语,早就为日后的 UI 跨途径奠定了根底。

Compose Multiplswift怎样读a数据库体系的特点tf数据库原理orm 将整Swift合现有的三个 Compose 项目:AndroidDesktopWeb,未来能够像 Kotlin Multiplatform Project 相同,在一个工程下开发跨端使用,一致的声明式范式让代码在最大程度上完swiftkey结复用,真正做到wrswiftui下拉改写ite once,run anywhswift代码是什么意思ere 。现在进入数据处理 alpah 阶段标志着其 API 也日渐老练,相信不久的未来正式版就会与我们碰头。

我们经过官方 todoapp 的比如,提前swiftui结构领会一下 Compose Multiplatform 的魅力
gijetbrains monothub.com/JetBrains/c…

不止 Android!Compose Multiplatform 来了

todoapp 工程

  • todoapp

    • common:途径无关代码

      • compose-ui :UI层可复用代码(兼容 Android 与 Desktop)
      • main:逻辑层可复用代码(主页)
      • edit:逻辑层可复用代码(编辑)
      • root:逻辑层进口、导航处理( main 与 eidt 间页面jetbrains官网跳转)
      • utils:东西类
      • database:数据库
    • android:途径相关代码,Activity 等
    • desktop:途径相关代码,application 等
    • web:途径相关,index.htm数据库查询句子l 等
    • ios:comswiftui形式pose-ui 尚不支撑 ios,但经过KMM协作SwiftUI能够结束iOS端代码

项目依据 Model-View-Intent(aka MVI) 打造,Model层、ViewModel层 代码简直能够 100% 复用,View层在 desktop 和 Android 也可结束大部分复用,web 有必定特别性需求独自适配。

不止 Android!Compose Multiplatform 来了

除了 Jetpack C数据库有哪几种ompose 以外,项目中使用了多个依据 KM 的三方结构,保证了上层的开发范式在多途径上的一起领会:

KM三方库 阐明
Decomposswiftui规划e 数据通信(BLoC)
MVIKotlin 跨途径MVI
Rektive 异步照应式库
SQLDeliswiftui官网ght 数据库数据处理包含数据的

t数据处理软件odoapp 代码

途径进口代码

对比一下 Android端 与 De数据库体系的中心是sktop端 的进口代码jetbrains是什么软件

//todoapp/androjetbrains monoid/src/main/java/exampleSwiftUI/todo/android/MainActivity.kt
cswiftlylass MainActivit数据库原理y : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstaswiftui快速开发appnceState)
val数据库办理体系 root = todoRoot(defaultComponeswiftui实用事例ntjetbrains-agent.jar怎样用Context())
setContent {
ComposeAppTheme {
Surface(swift代码color = MaterialTheme.colors.background) {
TodoRootContent(root)
}
}
}jetbrains-agent.jar怎样用
}
privaswift代码是什么意思te fun todoRoot(componentContext: ComponentContext): TodoRoot =
TodoRootComponent(
componentContext = componentContext,
storeFactory = Logginswiftui结构gStoreFactory(TimeTravelStoreFactory(DefaultStoreFactory())),
database = DefaultTodoSharedDatabase(TodoDatabaseDriver(contex数据处理工程师t = this))
)
}
//todoapp/desktop/src/jvmMain/kotlin/数据处理办法有哪些exampljetbrains monoe/todo/desktop/Main.kt
fun mjetbrains怎样读ain() {
overrideSchedulers(main = Dispatchers.Main::asScheduler)
val lifecycle = Lijetbrains官网fecycleRswiftui形式egistry()
val root = todoRoot(DefaultComponentContext(lifecycle = lifecycle))
applswiftui形式ication {
val windowState = rememberWindowState()
LifecycleController(lifecycle, winjetbrains激活码dowState)
Window(
onCloseRequest = ::exitApplication,
state = windowState,
title = "Todo"
) {
Surface(modifier = Modifier.fillMaxSize()) {
Majetbrains官网teri数据库体系工程师alTheme {
DesktopTheme {
TodoRootContent(root)
}
}
}
}
}
}
private fun todoRoot数据库(componentContext: ComponentContext): Todoswift世界结算体系Root =
TodoRootComponentjetbrains mono(
componentContext = componentContext,
sto数据库体系的中心是reFactory = DefaultSswiftui规划to数据处理软件reFactory(),
database = DefaultTodoSharedDatabase(TodoDatabaseDriver())
)
  • TodoRootContent:根Cojetbrains clionmposable数据处理办法有哪些,View层进口
  • TodoRootComponent:根状况处理器,ViewModel层进口

    • DefaultStoreFactory:创立 Store,处理状况
    • Defjetbrains激活码aultTodoShareDatabase:M层,swiftui快速开发app数据处理

TodoRootContentTodoRootComponswiftui形式en数据处理包含数据的t 别离是 View 层和 ViewModel 层的进口,TodoRootComponent 处理着大局状况,即页swiftui快速开发app面导航状况。

能够看到,Android 与 Desktop 在 View 、 VM 、M等各层都进行了大面积复用,

VM层代码

MVI 中尽管没有 ViewModel,可是有等价概念,jetbrains什么意思从习气启航我们暂且称之为 VM 层。 VM层其实就是状况的处理场所,我们以主页的 mian 为例

//todoapp/common/main/src/cswift代码ommonMain/kotlinswifter/example/todo/common/main/integration/TodoMainComponent.kt
class TodoMainComponent(
componentContext: ComponentContext,
storeFactory: StoreFactory,数据库办理体系
database: TodoSharedDatabase,
private val output: Consumer<Outpjetbrains ideaut>
) : TodoMain, ComponentContext by componentContext {
private val store =
instanceKeeper.getStore {
TodoMainStoreProvider(
storeFactory = storeFactory,
d数据库规划atabase = TodoMainStoreDatabase(数据库查询句子database = database)
).provide()
}
override val models: Value<Model> = store.asValue().map(stateTo数据库有哪几种Model)
ovswiftererride fun onItemCliswiftercked(id: Long) {
output(Output.Selected(id = id))
}
override数据处理是什么 fuSwiftUIn onItem数据库查询句子DoneChanged(id: Long, isDone: Boolean) {
store.accept(Intent.SetItemDone(id = id, isDone = isDone))
}
ovswiftui结构erriswiftui教程de fun onItemDeleteClicked(id: Long) {
store.jetbrains-agent.jar怎样用accept(Intent.DeleteItem(id = id))
}
override fun onInputTextChanged(数据处理办法有哪些text: String) {jetbrains什么意思
store.accept(Intent.SetText(text = text))
}
override fswiftui形式un onAddItemClic数据库原理ked() {
store.accept(Intent.AddItem)
}
}

了解 MVI 的朋友对上面SwiftUI的代码应该非常了解,store 处理状况并经过 models数据处理UI显露,一切数据流单向活动。 Value<Model> Decompose 库中的类型,能够理解为跨途径的 LiveData

View层代码

@Composable
fun TodoRo数据处理工程师otContent(component: TodoRoot) {
Children(routerState = component.routerState, animati数据处理工程师on = crossfadeScale()) {
when (val child = it.instance) {
is Child.Main -> TodoMainContent(child.component)数据处理包含数据的收集加工和输出
isswift代码怎样查询 Child.Editjetbrains什么意思 -> TodoEditContent(child.component)
}
}
}

TodoRootswiftui官网Content内部很简单,就是依据导航切换不同的页面。

具体看一下TodoMainContent

@Cswift代码是什么意思omposable
fjetbrains中文版un TodoMainContent(component: TodoMain) {
val mojetbrains-agent.jar怎样用del by component.models.subscribeAsState()
Colu数据库mn {
TopAppBar(tswift代码怎样查询itle = { Text(text = "Todo List") }jetbrains怎样读)
Box(Modifier.weight(1F)) {
TodoList(
items = model.items,
onIswift怎样读temClicked = component::onItemClicked,
onDoneChanged = component::onItemDoneChanswiftcode是什么意思中文ged,
onDeleteItemClicked = component::onItemDeleteClicked
)
}
TodoInput(
text = model.text,
onAddClicked = component::onAddItemClicked,
onTextChanged = component::onInputTe数据库体系的中心是xtChanged
)
}
}

subscribjetbrains monoeAsState() 在 Composable 中订阅了 Models 的状况,从而swift代码怎样查询驱动 UI 改写。ColumnBox 等 Composalbe 在 Descktop 和 Android 端会别离进行途径烘托。

web端代码

毕竟看一下web端结束。

Compose For Web 的 Composalbe 大多依据 DOM 规划,无法像 Android 和 Desktop 的 Composable 那样复用,可是 VM 和 M 层依然能够许多复用数据库软件

//todoapp/web/src/jetbrains什么意思jsMain/kotlin/example/todo/web/App.kt
fun main() {
vaswift选手l rootElement = document.getElementById("rswift代码怎样查询oot") as HTMLElement
val lifecycle = LifecycleRegistry()
val root =
TodoRootComponent(
componentContext = DefaultComponentConswiftkeytext(lifecycle = lifecycle),
storeFactory = DefaultStoreFactorswift世界结算体系y(),
databasswift世界结算体系e = Dejetbrains ideafaultTodoSharedDatabase(todoDatabaseDriver())
)
lifecycle.resume()
renderComposable(root = rootElement) {
Style(Styles)
TodoRootUi(root)
}
}

TodoRootComponent 传给 UI, 帮忙进行导航处理

@Composable
fun TodoRootUi(component: TodoRoot) {
Card(
attrs = {
style {
position(Position.Absolute)
height(700.px)
propswift代码怎样查询erty("max-width", 640.px)
top(0.px)
bottom(0.px)
lefjetbrains怎样读t(0.px)
right(0.px)
pr数据处理的最小单位是operty("margin", auto)
}
}
) {
val routerState by component.routerState.subscribeAsState()
Crossfade(
target = routerState.activeChild.instance,
attrs = {
style {
width(100.percent)
height(100.percent)
positio数据库查询句子n(Position.Relative)
left(0.px)
top(0.px)
}
}
) { child -&gt数据库办理体系;
when (child) {
is TodoRoot.Child.Main -> TodoMainUi(child.component)
is TswifterodoRoot.Child.Edit -> TodoEditUi(child.component)
}
}
}
}数据处理办法有哪些

TodoMainUi 的结束如下:

@Composable
fun TodoMainUi(cojetbrains是什么软件mponent: TodoMain) {
val model by compojetbrains中文版nent.models.subscribeA数据库体系概论第五版课后答案sStatejetbrains clion()
Div(
attrs = {
style {
width(100.percent)
heightJetBrains(100.percent)
display(DisplayStyle.Flex)
flexFlow(Fswiftui结构lexDirection数据库体系工程师.Column, FlexWrap.Nowrap)
}
}
) {
Div(
attrs数据库体系的中心是 = {
style {
width(100.percent)
property("flex", "0 1 auto")
}
}
) {
NavBjetbrains什么意思ar(title = "Todo List")
}
Ul(
attrs = {
style {
width(100.percent)
margin(0.px)
propertyswiftly("flex", "1 1 auto")
property("ov数据库体系的特点erflow-y", "scroll")
}
}
) {
model.items.forEach { item ->
Item(
item = item,
onClicked = component::onIt数据处理工程师emClicked,
onDoneChanged = component::onItem数据处理员是干什么的DoneChanged,
onDeleteClicked = component::onItemDeleteClicked
)
}
}
Div(
attrs = {
style {
wid数据库体系的特点th(100.percent)
pjetbrains怎样读roperty("flex", "0 1 auto")
}
}
) {
TodoInput(
text = model.text,
onTextC数据处理软件hanged = component::o数据库nInputTextChanged,
onAddClicked = component::onAddItemClicked
)
}
}
}

毕竟

在 Jetpack数据处理工程师 Compose Runtime : 声明式 UI 的根底 一文中,我曾介绍过 Compose 跨途径的技术根底,现在协作各种 KM 三方库,使得开发生态愈加完jetbrains-agent.jar怎样用好。 Compose Multiplatform 全程依据 Kotlin 打造,上下游同构,相对于 Flutter 和 RN 更具优势,未来可期。