Jetpack Compose 和即将退场的 Fragment

Jetpack Compose 和即将退场的 Fragment

1 文章信息

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:

 

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

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

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

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

5 结论

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

这里是示例程序GitHub地址

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在`MainActivity`中更新`mutableStateOf`对象,您需要将其传递给`MainFragment`,然后在`MainFragment`中更改其值。以下是一种可能的方法: 首先,在`MainActivity`中创建一个`mutableStateOf`对象: ```kotlin class MainActivity : AppCompatActivity() { private val myMutableState = mutableStateOf("Initial Value") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MyMainScreen(myMutableState) } } } ``` 然后,在`MainFragment`中接收该对象并更新它: ```kotlin class MainFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val myMutableState = remember { mutableStateOf("Initial Value") } return ComposeView(requireContext()).apply { setContent { MyFragmentScreen(myMutableState) } } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Update the value of myMutableState from MainActivity (requireActivity() as MainActivity).myMutableState.value = "New Value" } } ``` 在`MainFragment`中,我们首先使用`remember`关键字创建了一个`mutableStateOf`对象。然后,我们将其传递给了`MyFragmentScreen`,这是一个自定义的Compose函数,用于显示该状态的值。 在`onViewCreated`方法中,我们从`MainActivity`获取了该对象,并直接更新了其值。这将自动通知Compose系统重新绘制UI以反映新的值。请注意,由于该对象是可变的,因此我们可以将其值更改为任何其他值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值