2025年上半年过去,我作为聋人独立开发者,学习IOS开发的反思总结,我认为移动端(ios、aos)开发的基础知识和核心思想是共通的,入门很容易,任何技术是一种工具。如果要达到精通水平,能够开发高质量、稳定、安全的复杂应用,除了扎实的逻辑能力和技术方向感之外,还需要深入理解平台特性、不断学习新的技术和最佳实践,还需要具备解决实际工程问题的丰富经验。
在构建复杂的移动app时,尤其像银行涉及敏感数据和复杂业务流程,说明了状态管理很重要,例如,用户账户余额、交易记录、账户详情、支付状态等,这些都是应用的核心状态。这些状态需要Screen、Component之间实时同步、安全地共享和精确地更新。
想象一下一个银行应用:用户查看账户列表、进入某个账户查看余额和最近交易、发起转账、接收推送通知更新余额。这些操作和事件都会导致应用状态的变化,并且这些变化需要立即反映在相关的界面上。如果状态管理不当,可能导致数据不一致、更新混乱,甚至引发严重的安全问题,在金融应用中是绝对不能接受的。
本文以一个简化的银行应用场景为例,深入了解如何在 aOS和iOS平台中实现 Redux模式进行状态管理。
用户点击“存款”按钮 -> 应用分发一个包含存款金额的 DepositAction
-> Store 接收到 Action -> Store 将当前 State 和 DepositAction
一起传递给 Reducer -> Reducer 计算出新的 State (余额增加) -> Store 更新其内部状态为新的 State -> UI 监听到 Store 的状态变化 -> UI 重新渲染UI,显示新的余额。
构建一个简化的银行账户界面演示
创建一个 Kotlin 数据类来表示银行相关的状态,包含账户余额和交易列表。
// State.kt
data class BankingState(
val balance: Double = 0.0, // 账户余额,默认为 0.0
val recentTransactions: List<String> = emptyList() // 最近交易列表,默认为空
// ... 其他状态字段
)
密封类所有可能的状态变化动作。例如,存款、取款和加载交易记录。
// Action.kt
sealed class BankingAction {
//存款动作,带存款金额
data class Deposit(val amount: Double) : BankingAction()
//取款动作,带取款金额
data class Withdrawal(val amount: Double) : BankingAction()
//加载交易记录,带交易记录列表
data class SetTransactions(val transactions: List<String>) : BankingAction()
//其他Action
}
编写纯函数,接收当前的 BankingState
和一个 BankingAction
,返回一个新的 BankingState
// Reducer.kt
val bankingReducer: Reducer<BankingState> = { state, action ->
//Reducer根据Action的类型和数据计算新的状态
when (action) {
is BankingAction.Deposit -> {
//处理存款:创建一个新的状态,金额加到余额
state.copy(balance = state.balance + action.amount)
}
is BankingAction.Withdrawal -> {
//处理取款:创建一个新的状态,从余额中减去金额
//注意:实际银行需要更复杂的逻辑处理支出、手续费等
state.copy(balance = state.balance - action.amount)
}
is BankingAction.SetTransactions -> {
//处理设置交易记录Action:创建一个新的状态,更新交易列表
state.copy(recentTransactions = action.transactions)
}
else -> {
//返回当前状态(不改变)
state
}
}
}
// AppStore.kt
val appStore = createStore(bankingReducer, BankingState())
//BankingScreen.kt
@Composable
fun BankingScreen() {
//selectState只监听Store中关心的那个部分状态
//balanceState是State<Double>,当Store中余额变化时更新
val balanceState = selectState(appStore) { state -> state.balance }
val currentBalance = balanceState.value //获取当前余额
//transactionsState是State<List<String>>,当Store中交易记录变化时更新
val transactionsState = selectState(appStore) { state -> state.recentTransactions }
val recentTransactions = transactionsState.value //获取交易记录列表
//rememberDispatcher获取Store的dispatch函数
val dispatch = rememberDispatcher(appStore)
// 模拟加载交易记录(处理VM或Effect处理)
LaunchedEffect(Unit) {
//首次出现时,模拟加载交易记录并分发Action
//网络请求的结果
val loadedTransactions = listOf("Deposit +100.0", "Withdrawal -50.0", "Deposit +200.0")
dispatch(BankingAction.SetTransactions(loadedTransactions))
}
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp),
horizontalAlignment = Alignment.CenterHorizontally
) {
Text(text = "当前余额:", fontSize = 18.sp)
Text(
text = "$${String.format("%.2f", currentBalance)}", //格式化余额显示
fontSize = 24.sp,
fontWeight = FontWeight.Bold,
modifier = Modifier.padding(bottom = 16.dp)
)
Row(
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
Button(onClick = {
//点击存款按钮,分发Deposit Action (假设存入100)
dispatch(BankingAction.Deposit(100.0))
}) {
Text("存款 +100")
}
Button(onClick = {
//点击取款按钮,分发Withdrawal Action (假设取出50)
dispatch(BankingAction.Withdrawal(50.0))
}) {
Text("取款 -50")
}
}
Spacer(modifier = Modifier.height(24.dp))
Text(text = "最近交易:", fontSize = 18.sp, modifier = Modifier.align(Alignment.Start))
LazyColumn(
modifier = Modifier.fillMaxWidth()
) {
items(recentTransactions) { transaction ->
Text(text = transaction, modifier = Modifier.padding(vertical = 4.dp))
}
}
}
}
通过selectState
,Composable 函数能够高效响应状态变化。rememberDispatcher
提供了一种简单的方式发起 Action,驱动状态更新。LaunchedEffect
用来模拟组件首次加载时触发加载交易记录的副作用(虽然副作用本身不属于 Reducer)。
主要讲了两件事:
第一,在做像Bank应用时,把数据(也就是“状态”,比如余额、交易记录)管好非常非常重要,不然数据容易乱,还不安全。
第二,介绍了 Redux 方法解决这个问题。Redux 的核心思想就是把所有重要数据放一个地方(Store)管理,数据的变化过程得按规矩来(收到指令 -> 处理 -> 更新数据)。这样数据流向就清晰了,不容易出错,容易找到问题。
最后,通过一个简单的 Android 例子,展示了 Redux 具体是怎么在代码里实现的。
总的来说,管理好App里的数据是做出高质量、稳定应用的关键。Redux 提供一个很好的管理思路,而且这个思路在iOS开发里也一样用得上。掌握它,能帮你更好地开发更复杂的应用。
谢谢大家的阅读)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有