
рдордИ рдореЗрдВ, Google I / O 2019 рдиреЗ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ Android UI рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд░реВрдкрд░реЗрдЦрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬрд┐рд╕реЗ Jetpack Compose рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдорд╣реАрдиреЗ рдмрд╛рдж, WWDC 2019 рдореЗрдВ, SwiftUI рдирд╛рдордХ iOS рдХреЗ рд▓рд┐рдП рдПрдХ рдпреВрдЖрдИ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИред рдЗрди рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдореЛрдмрд╛рдЗрд▓ рд╡рд┐рдХрд╛рд╕ рдХрд┐рд╕ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рдерд╛, рдФрд░ рдореИрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рд╕рдордп рдЗрди рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИред
рд╕рд░рд╕рд░реА рд╕рдореАрдХреНрд╖рд╛
рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдореАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ IOS рдХреЗ рдкрд╛рд╕ рд╢рд╛рдВрдд рдкреНрд░рд▓реЗрдЦрди рдерд╛ред

рдФрд░ Android рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреА рдкреВрд░реА рдХрдореАред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреЗрдЬ рдкрд░ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред
рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛
SwiftUI рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдмрд╕ MacOS рдХреЛ рдмреАрдЯрд╛ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ, Xcode 11 рдмреАрдЯрд╛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ, рдФрд░ "SwiftUI" рдЪреЗрдХрдмреЙрдХреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВред

Jetpack Compose рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рд╣рдореЗрдВ Jetpack рд╕реЗ рдирд╡реАрдирддрдо рдмрд┐рд▓реНрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдпреВрдЖрдИ-рдбреЗрдореЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЯрд╛рдЗрдк рдХрд░рдХреЗ, рдпрд╣ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХрд┐рди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред SwiftUI рдХреА рддреБрд▓рдирд╛ рдореЗрдВ Compose рдХрд╛ рдПрдХ рдмрд╣реБрдд рджреБрдЦрдж рдкрд╣рд▓рд╛ рдкреНрд░рднрд╛рд╡ред
рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦреЗрдВ@Composable fun HelloWorld() { Text(text = "Hello world") }
SwiftUI рдЙрджрд╛рд╣рд░рдг рд╣реИ struct ContentView: View { var body: some View { Text("Hello SwiftUI!") } }
рдпреВрдЖрдИ рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдмрд╣реБрдд рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд░реВрдк рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИред
рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрдХ
рд╕реНрд╡рд┐рдлреНрдЯреБрдИ рдПрдХ рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрдХ (рдХреИрдирд╡рд╛рд╕) рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ,
рдЬреЛ:
- рдХреЛрдб рдмрджрд▓рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рд╕реНрдХреНрд░реАрди рдХреЛ рдлрд┐рд░ рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ;

- рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдХрдИ рдбрд┐рд╡рд╛рдЗрд╕ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо;

- рд╕рдВрдкрд╛рджрдХ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдЧреБрдг ui рдХреЛ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ;
- рдФрд░ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╢рд╛рдВрдд - рдЖрдк рд╕рдВрдкрд╛рджрдХ рд╕реЗ рдпреВрдЖрдИ рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдХреНрд░реАрди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдЬреЗрдЯрдкреИрдХ рдХрдореНрдкреЛрдЬрд╝ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЛрдИ рджреГрд╢реНрдп рд╕рдВрдкрд╛рджрдХ рдирд╣реАрдВ рд╣реИред
рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
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) }
рд╕реВрдЪреА рддреИрдпрд╛рд░ рд╣реИред
рд░рдЪрдирд╛ рдореЗрдВ рдЕрднреА рддрдХ рдПрдХ рд╕реВрдЪреА рд╡рд┐рдЬреЗрдЯ рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдЖрдк рдХреЙрд▓рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Column { listOf( "", "", "", "", "", "", "", "", "" ) .forEach { name -> Text(text = name, style = +themeTextStyle { h2 }) } }
рд▓реЗрдХрд┐рди рд╡рд╣ рд╕реНрдХреНрд░реЙрд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЬреЛ рд╕рдмрд╕реЗ рджреБрдЦрдж рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ Google рд╕реЗ рдЙрджрд╛рд╣рд░рдг рднреА рдЕрдВрддрд┐рдо рд░реВрдк рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкрджрд╛рдиреБрдХреНрд░рдо рджреЗрдЦреЗрдВ
SwiftUI рдореЗрдВ, UIViewController рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рддрддреНрд╡ рдПрдХ рдирдпрд╛ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рдирдпрд╛ рджреГрд╢реНрдп рдШрдЯрдХ рд╣реИред рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ Apple рдиреЗ UIViewController рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реБрдП, рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдПрдХ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╕рд░реНрд╡реЛрддреНрддрдо рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред
struct ContentView : View { var body: some View { Text("ContentView2 ") .onDisappear(){ print("onDisappear") } .onAppear{ print("onAppear") } } }
рдХрдореНрдкреЛрдЬрд╝ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░реВрдЯ рддрддреНрд╡ рд╕рд╛рдорд╛рдиреНрдп 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") } } } } }
рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рд░реВрдЯ рджреГрд╢реНрдп рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рдпреВрдЖрдИ рдШрдЯрдХ рдЕрдм рдПрдХреНрд╕рдПрдордПрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдВрдкреЛрдЬ рд╡рд┐рдЬреЗрдЯ рдХреЗ рд╕рд╛рдеред
рдиреЗрд╡рд┐рдЧреЗрд╢рди
SwiftUI рдореЗрдВ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдХреМрди рд╕рд╛ рджреГрд╢реНрдп рдЦреЛрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
NavigationButton(destination: LandmarkDetail()) { LandmarkRow(landmark: landmark) }
рдХрдореНрдкреЛрдЬрд╝ рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рддрддреНрд╡ рдЧрддрд┐рд╡рд┐рдзрд┐ рдпрд╛ рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
рдЧрдпрд╛ рд╣реИ ред
рд╕рдорд░реНрдерд┐рдд рд╕рдВрд╕реНрдХрд░рдг
SwiftUI рд╕рд┐рддрдВрдмрд░ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ iOS 13 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдм iPhone 5S, iPhone6, iPhone 6 Plus рдкрд░ рд╕рдкреЛрд░реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡реЗ рдЗрди рдореЙрдбрд▓реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рддреИрдпрд╛рд░ рд╣реЛрдВрдЧреЗред
рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕рдорд░реНрдерд┐рдд рдпреЛрдЬрдирд╛рдУрдВ рдХреА рд░рдЪрдирд╛ рдХрд░реЗрдВред
рд╕рдорд╛рдкрди
рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЙрдИ рдХреЗ рд▓рд┐рдП рджреЛ рдирдП рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдврд╛рдВрдЪреЗ рдереЗред рдирддреАрдЬрддрди, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдРрдкреНрдкрд▓ рдиреЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдХрдИ рдореЗрдВ "рдЕрддрд┐рд╢рдпреЛрдХреНрддрд┐ рдХреА рд╕реНрдерд┐рддрд┐" рд╣реИред рдФрд░ Google рдиреЗ рдПрдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬреЛ рдЗрддрдирд╛ рдХрдЪреНрдЪрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реНрддрд░ рдкрд░ рднреА рдХрд┐рддрдиреЗ рдЕрдВрдХ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред