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

本文涉及的产品
PolarDB Agent Express,2核4GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
云数据库 PolarDB MySQL 版,列存表分析加速 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开发里也一样用得上。掌握它,能帮你更好地开发更复杂的应用。

相关文章
|
9月前
|
人工智能 IDE 前端开发
云开发CloudBase 实现五子棋在线小游戏
本文介绍了使用腾讯云CloudBase和CodeBuddy IDE开发在线对战五子棋小游戏的过程。作者通过本地工具配置CloudBase AI ToolKit,尝试创建云函数和使用云数据库存储游戏数据,但在云函数部分遇到困难。随后改用CodeBuddy IDE进行开发,利用其AI全栈能力实现从需求规划、代码开发到部署的全流程。开发过程中遇到云函数异常、前端交互问题等,通过AI对话式调试(截图、日志分析)高效修复,最终实现支持实时对战、房间管理、胜负判定等功能的双端适配五子棋游戏,并成功部署上线。
391 0
|
9月前
|
人工智能 数据安全/隐私保护 容器
基础知识与排版技巧全面指南
本教程详细介绍了HTML基础标签的使用,包括排版标签、块级与行内元素、文本标签、图片与超链接、列表、表格、表单控件等内容,适合初学者系统学习HTML结构与语义化标签的应用。
232 0
|
9月前
|
JSON 人工智能 API
工具演变 & MCP基础
本内容介绍了大模型工具调用方式的演进历程,从早期的函数表达阶段到OpenAI的标准化工具定义,再到结构化推理的引入。同时深入解析了MCP(Model Context Protocol)的核心价值,即通过统一协议降低Agent与工具服务集成的工程复杂度,提升工具调用的标准化与效率。
405 0
|
9月前
|
人工智能 缓存 安全
你还是没有理解CAS
在高并发场景下,使用 `count++` 统计商品浏览次数可能导致计数丢失。本文介绍了如何使用 CAS(Compare and Swap)实现无锁的原子操作来解决该问题。CAS 通过比较内存值与期望值,确保更新操作的原子性,避免了线程竞争带来的数据错误。文章详细解析了 CAS 的工作机制、优势与局限性,并结合 Java 示例展示了其底层实现与实际应用,如高性能计数器、无锁栈和缓存更新策略。此外,还探讨了 CAS 可能引发的 ABA 问题及其解决方案,如版本号机制。最后,通过性能对比分析,帮助开发者根据场景合理选择并发控制方式。
213 0
|
9月前
|
JSON 人工智能 前端开发
JSON基础知识与实践
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于JavaScript语言的子集,具有易读、易解析和跨语言等优点。它广泛应用于前后端数据交换、API设计、配置文件存储及移动应用开发等场景。JSON数据由键值对构成,支持字符串、数值、布尔值、数组和对象等类型,结构清晰且可嵌套,适合网络传输。自2001年由Douglas Crockford提出后,JSON因其简洁性和灵活性逐渐成为互联网主流数据格式之一,并被标准化为ECMA-404。
782 0
|
9月前
|
人工智能 Shell vr&ar
从原理到实践
相机标定是计算机视觉中的关键步骤,用于将真实世界的3D点映射到图像的2D平面。通过标定,可以消除镜头畸变、获取物体的真实尺寸,并实现精确的3D重建和姿态估计。标定过程通常使用棋盘格标定板,通过检测角点的3D和2D坐标来计算相机的内参矩阵和畸变系数。本文介绍了标定的原理、工具使用方法、代码解析及实际应用技巧,帮助用户高效完成标定工作。
301 0
|
9月前
|
人工智能 监控 JavaScript
用 iotop、vmstat、uptime 精准定位瓶颈
系统性能变慢可能由多种因素导致,如 CPU、内存、I/O 或网络瓶颈等。通过工具如 uptime、vmstat 和 iotop,可以快速定位问题根源。合理使用监控工具与自动化告警,能有效提升系统稳定性与性能。
173 0
|
9月前
|
机器学习/深度学习 人工智能 自然语言处理
掌握从模型选型到部署优化的全流程
本文深入探讨了AI大模型的开发与应用,涵盖基础概念、模型架构、关键技术、训练方法、应用策略、评估优化及伦理安全七大核心内容。从人工智能的定义到深度学习、通用人工智能(AGI)的探索,再到Transformer架构、混合专家模型(MoE)等前沿技术,系统解析了构建智能系统的基石与工程效率的引擎。文章还介绍了提示工程、检索增强生成(RAG)、AI智能体等应用策略,强调了模型评估与优化的重要性,并探讨了AI伦理与安全的关键议题。适合希望全面了解AI大模型开发的技术人员与研究者参考。
661 0
|
机器学习/深度学习 自然语言处理 算法
聊天机器人开发的最佳实践:技术探索与案例分析
【8月更文挑战第22天】聊天机器人作为人工智能领域的重要应用之一,正逐步改变着人们的生活和工作方式。通过遵循最佳实践和技术探索,开发者可以开发出更加智能、高效、安全的聊天机器人产品。未来,随着技术的不断进步和应用场景的不断拓展,聊天机器人将在更多领域发挥重要作用。
|
消息中间件 数据库
RabbitMQ启动报错:Error during startup: {error, {schema_integrity_check_failed,
通过上述步骤,可以逐步排查和解决RabbitMQ启动时出现的 `Error during startup: {error, {schema_integrity_check_failed, ...}}`错误。这些步骤包括检查磁盘空间、修复文件权限、清理Mnesia数据库、检查日志文件以及升级或重装RabbitMQ。希望这些方法能帮助您解决问题,使RabbitMQ顺利启动并正常运行。
1078 1