Jetpack Compose 和即将退场的 Fragment

Jetpack Compose 和即将退场的 Fragment

  • 1. 文章信息
  • 2. 介绍
  • 3. 谁杀死了 Fragment?
  • 4. 可组合函数应当放到哪里?
  • 5. 结论

1 文章信息

  • 原文:https://sonique6784.medium.com/jetpack-compose-and-the-fall-of-fragments-54bf9977da1a
  • 作者:Cédric F
  • 翻译:tommwq

2 介绍

本文是关于如何组织 Jetpack Compose 项目结构的。我不会讲怎样创建可组合函数,这方面已经有太多的文章了。

Jetpack Compose 是一个新的 UI 工具箱,它基于函数式和声明性原则,助你为 Android(或其他平台)构建新颖优雅的界面。

3 谁杀死了 Fragment?

在现今的 Android 世界中(当前 Jetpack Compose 仍然是 beta 状态),我们通常会采用下面的架构:

Listing 1: 现今 Android 应用的常见架构

Application
    - ActivityA
         - Fragment1 + ViewModel1
         - Fragment2 + ViewModel2
    - ActivityB
         - Fragment3 + ViewModel3

如果我们从架构中删除 Fragment,有什么可以替代它呢?我们要如何处理 ViewModel 呢?

我们回忆一下 MVVM 模式:

  • Model
  • View
  • ViewModel

Fragment 在其中只是 View(因而须避免在 Fragment 中添加业务逻辑)。使用 Jetpack Compose 你可以使用可组合函数替代 Fragment 作为 View 使用。我们用一个示例应用来说明。这是一个简单的、包含 2 个屏幕的应用,你可以在屏幕 1 和屏幕 2 之间相互跳转。每个屏幕拥有自己的 View 和 ViewModel。在 Activity 中我们将对 View 和 ViewModel 进行实例化。

Listing 2: 示例应用

Application
    - ActivityA
        - ComposableScreen1View(ViewModel1)
        - ComposableScreen2View(ViewModel2)

如同使用 Fragment,我们需要以参数的方式,将 ViewModel 传递给可组合函数(使用 ktx 或 ViewModel provider)。你需要在 Activity 中实例化 ViewModel,然后传递给可组合函数。

Listing 3: Activity.kt

private val screen1ViewModel: Screen1ViewModel by viewModels()
ComposableFunctionScreen1View(screen1ViewModel)

注:如果你使用 Koin,你可以在可组合函数中直接使用 getViewModel() 获得 ViewModel。

4 可组合函数应当放到哪里?

这是一个好问题。你可以将一切东西临时的保存到 Activity 中。事实上大部分人正式这么做的。但是这种方法不适合大的项目。可组合函数可以保存到一个独立的文件中,这将大大优化项目结构。我的建议是,为每个特性或屏幕建立一个类似下面的 package:

Jetpack Compose 和即将退场的 Fragment_第1张图片

 

 screen1 目录是应用的屏幕或特性,包含 View 和 ViewModel。重要的是这里没有任何 XML 文件,你所需要的都在 package 中。

在 ui 目录中我们可以找到:

  • common 目录保存了可重用组件,比如自定义的 MyButton 控件。
  • navigation 目录保存导航、屏幕跳转等相关内容。

这看起来真不错。可重用函数可以在 Activity 中导入并使用,就像其他 kotlin 文件一样。可重用组件也是如此。

5 结论

上面就是这篇短文的结论。希望对你有所帮助。如果你觉得还有可以改进的地方,请在评论中分享你的思考 :)

这里是示例程序GitHub地址。

你可能感兴趣的:(android)