在移动端开发实现Redux以Bank为例

本文涉及的产品
PolarDB Agent Express,2核4GB
PolarSearch,搜索节点 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 在构建涉及敏感数据和复杂业务流程的银行类移动应用时,状态管理至关重要。本文以Redux模式为核心,介绍了如何在Android和iOS平台实现高效的状态管理,确保数据同步、共享和更新的安全与准确。通过示例代码演示了State、Action、Reducer和Store的实现,并结合Jetpack Compose展示了Redux在UI中的应用,帮助开发者构建高质量、稳定的金融类应用。

在构建复杂的移动app时,尤其像银行涉及敏感数据和复杂业务流程,说明了状态管理很重要,例如,用户账户余额、交易记录、账户详情、支付状态等,这些都是应用的核心状态。这些状态需要Screen、Component之间实时同步、安全地共享和精确地更新。

想象一下一个银行应用:用户查看账户列表、进入某个账户查看余额和最近交易、发起转账、接收推送通知更新余额。这些操作和事件都会导致应用状态的变化,并且这些变化需要立即反映在相关的界面上。如果状态管理不当,可能导致数据不一致、更新混乱,甚至引发严重的安全问题,在金融应用中是绝对不能接受的。

本文以一个简化的银行应用场景为例,深入了解如何在 aOS和iOS平台中实现 Redux模式进行状态管理。

二、理解应用中的Redux流程

用户点击“存款”按钮 -> 应用分发一个包含存款金额的 DepositAction -> Store 接收到 Action -> Store 将当前 State 和 DepositAction 一起传递给 Reducer -> Reducer 计算出新的 State (余额增加) -> Store 更新其内部状态为新的 State -> UI 监听到 Store 的状态变化 -> UI 重新渲染UI,显示新的余额。

三、AOS平台实现Redux State管理

构建一个简化的银行账户界面演示

1 定义 State

创建一个 Kotlin 数据类来表示银行相关的状态,包含账户余额和交易列表。

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// State.kt
data class BankingState(
    val balance: Double = 0.0, // 账户余额,默认为 0.0
    val recentTransactions: List<String> = emptyList() // 最近交易列表,默认为空
    // ... 其他状态字段
)

2. 定义 Action

密封类所有可能的状态变化动作。例如,存款、取款和加载交易记录。

代码语言:javascript

代码运行次数:0

运行

AI代码解释

// 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
}

3. 实现 Reducer

编写纯函数,接收当前的 aly.sndclsh.com和一个 BankingAction,返回一个新的 BankingState

代码语言:kotlin

AI代码解释

// 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
        }
    }
}

4. 创建 Store

代码语言:kotlin

AI代码解释

// AppStore.kt
val appStore = createStore(bankingReducer, BankingState())

5. Jetpack Compose使用Redux State

代码语言:kotlin

AI代码解释

//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开发里也一样用得上。掌握它,能帮你更好地开发更复杂的应用。

相关文章
|
决策智能 开发者
手把手教你如何用AIGC大模型写一首歌
本文记录了作者用大模型创作歌曲及视频的全过程。
693 10
|
Android开发 开发者
HarmonyOS和OpenHarmony区别联系
【7月更文挑战第26天】
1099 17
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
568 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
人工智能
技术心得记录:关于自补图的认识和构造(无证明)
技术心得记录:关于自补图的认识和构造(无证明)
949 0
|
缓存 监控 测试技术
如何利用浏览器的缓存来优化网站性能?
【10月更文挑战第23天】通过以上多种方法合理利用浏览器缓存,可以显著提高网站的性能,减少网络请求,加快资源加载速度,提升用户的访问体验。同时,要根据网站的具体情况和资源的特点,不断优化和调整缓存策略,以适应不断变化的业务需求和用户访问模式。
891 63
|
机器学习/深度学习 自然语言处理 算法
聊天机器人开发的最佳实践:技术探索与案例分析
【8月更文挑战第22天】聊天机器人作为人工智能领域的重要应用之一,正逐步改变着人们的生活和工作方式。通过遵循最佳实践和技术探索,开发者可以开发出更加智能、高效、安全的聊天机器人产品。未来,随着技术的不断进步和应用场景的不断拓展,聊天机器人将在更多领域发挥重要作用。
1004 3
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
793 7
|
消息中间件 数据库
RabbitMQ启动报错:Error during startup: {error, {schema_integrity_check_failed,
通过上述步骤,可以逐步排查和解决RabbitMQ启动时出现的 `Error during startup: {error, {schema_integrity_check_failed, ...}}`错误。这些步骤包括检查磁盘空间、修复文件权限、清理Mnesia数据库、检查日志文件以及升级或重装RabbitMQ。希望这些方法能帮助您解决问题,使RabbitMQ顺利启动并正常运行。
1101 1
|
小程序 安全 搜索推荐
阿里云上的Salesforce这一年:深耕本地化,释放新价值
2023年云栖大会上,Salesforce宣布与阿里云合作,由后者负责其核心CRM产品在中国的销售与运营。此后,双方密集推进了一系列合作计划,包括2023年11月1日启动生态合作计划、2023年12月18日正式上线、2024年1月31日发布本地化扩展组件互联网关CXG等。这些举措不仅解决了数据合规和迁移难题,还通过本地化生态和创新功能提升了客户体验。云栖大会2024上,阿里云上的Salesforce展示了其在医疗健康和宠物营养品等行业中的成功案例,证明了其在中国市场的巨大潜力和价值。
413 4
|
存储 监控 安全
SaaS业务架构:业务能力分析
【9月更文挑战第20天】在数字化时代,软件即服务(SaaS)模式逐渐成为企业软件解决方案的首选。SaaS 业务架构设计对于提供高效、可靠的服务至关重要。其核心业务能力包括:用户管理(注册登录、角色权限)、数据管理(存储备份、安全共享)、业务流程管理(设计定制、工作流自动化)、应用集成(第三方应用、移动应用)及客户服务(支持培训、反馈改进)。通过优化这些能力,可为企业提供更高效、可靠的 SaaS 服务。
434 11