下一个 Android 技术前沿:快速掌握 Jetpack Compose

Compose简介

  • Jetpack Compose:利用声明式编程构建Android原生界面(UI)的 工具包

优势

  • 更少的代码、代码量锐减
  • 强大的工具/组件支持
  • 直观的 Kotlin API
  • 简单易用

Compose 编程思想

  • 声明性编程范式:声明性的函数构建一个简单的界面组件,无需修改任何 XML 布局,也不需要使用布局编辑器,只需要调用 Jetpack Compose 函数来声明想要的元素,Compose 编译器即会完成后面的所有工作

  • 举个栗子:简单的可组合函数

    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContent {
                Text("Hello world!")
            }
        }
    }
    

下一个 Android 技术前沿:快速掌握 Jetpack Compose_第1张图片

  • 动态 :组合函数是用 Kotlin 而不是 XML 编写,见上$name 的传入

  • 需要注意的事项:

    • 可组合函数可以按任何顺序执行

      //可以按任何顺序进行,不能让 StartScreen() 设置某个全局变量(附带效应)并让 MiddleScreen() 利用这项更改。相反,其中每个函数都需要保持独立。
      @Composable
      fun ButtonRow() {
          MyFancyNavigation {
              StartScreen()
              MiddleScreen()
              EndScreen()
          }
      }
      
    • 可组合函数可以并行执行

      • Compose 可以通过并行运行可组合函数来优化重组,这样一来,Compose 就可以利用多个核心,并以较低的优先级运行可组合函数(不在屏幕上)

      • 这种优化意味着,可组合函数可能会在后台线程池中执行,如果某个可组合函数对 ViewModel 调用一个函数,则 Compose 可能会同时从多个线程调用该函数

      • 调用某个可组合函数时,调用可能发生在与调用方不同的线程上,这意味着,应避免使用修改可组合 lambda 中的变量的代码,既因为此类代码并非线程安全代码,又因为它是可组合 lambda 不允许的附带效应

      //此代码没有附带效应
      @Composable
      fun ListComposable(myList: List) {
          Row(horizontalArrangement = Arrangement.SpaceBetween) {
              Column {
                  for (item in myList) {
                      Text("Item: $item")
                  }
              }
              Text("Count: ${myList.size}")
          }
      }
      
      
      //如果函数写入局部变量,则这并非线程安全或正确的代码:
      @Composable
      @Deprecated("Example with bug 有问题的代码")
      fun ListWithBug(myList: List) {
          var items = 0
      
          Row(horizontalArrangement = Arrangement.SpaceBetween) {
              Column {
                  for (item in myList) {
                      Text("Item: $item")
                      items++ // Avoid! Side-effect of the column recomposing.
                  }
              }
              Text("Count: $items")
          }
      }
      //每次重组时,都会修改 items。这可以是动画的每一帧,或是在列表更新时。但不管怎样,

你可能感兴趣的:(Android开发,移动开发,Android技术,android,compose)