Flutter控制流语句实战:在鸿蒙应用中根据性别显示不同图标

发布时间:2026/7/19 1:35:46
Flutter控制流语句实战:在鸿蒙应用中根据性别显示不同图标 作者付文龙红目香薰仓库地址https://gitcode.com/feng8403000/FlutterfromBeginnertoAdvancedForHarmonyOS.git联系邮箱372699828qq.com一、控制流语句概述控制流语句是编程语言中用于控制程序执行流程的基本结构。在Dart中控制流语句允许我们根据条件执行不同的代码块、循环执行代码、以及在特定条件下跳出或跳过代码。1.1 为什么控制流如此重要在Flutter应用开发中控制流语句扮演着至关重要的角色条件渲染根据条件显示不同的UI组件数据过滤根据条件过滤和处理数据循环处理遍历列表、集合等数据结构错误处理处理异常和错误情况状态管理根据状态执行不同的逻辑1.2 Dart控制流语句分类Dart提供了以下控制流语句语句类型具体语句用途条件语句if-else、switch根据条件执行不同代码循环语句for、while、do-while重复执行代码跳转语句break、continue控制循环流程异常处理try-catch-finally捕获和处理异常二、条件语句if-else2.1 基本语法if-else语句是最常用的条件语句用于根据条件执行不同的代码块if(条件1){// 条件1为true时执行}elseif(条件2){// 条件2为true时执行}else{// 所有条件都为false时执行}2.2 成绩等级判断示例int score85;if(score90){print(成绩等级: A);}elseif(score80){print(成绩等级: B);}elseif(score70){print(成绩等级: C);}elseif(score60){print(成绩等级: D);}else{print(成绩等级: F);}2.3 空安全与条件判断在Dart的空安全特性下需要注意处理可能为null的变量String?username付文龙;if(username!nullusername.isNotEmpty){print(欢迎,$username);}else{print(请登录);}短路求值Dart会进行短路求值当username ! null为false时不会继续判断username.isNotEmpty避免空指针异常。三、条件语句switch3.1 基本语法switch语句用于根据变量的值执行不同的代码块switch(表达式){case值1:// 值等于值1时执行break;case值2:// 值等于值2时执行break;default:// 不匹配任何case时执行}3.2 性别判断示例Stringgender男;switch(gender){case男:print(性别: 男);break;case女:print(性别: 女);break;default:print(性别: 未知);}3.3 多case共享代码多个case可以共享同一代码块Stringstatusonline;switch(status){caseonline:caseactive:print(用户状态: 在线);break;caseoffline:caseinactive:print(用户状态: 离线);break;default:print(用户状态: 未知);}3.4 if-else vs switch特性if-elseswitch判断条件任意布尔表达式固定值匹配适用场景复杂条件判断固定值分支可读性适合少量分支适合大量分支性能逐条件判断跳转表更高效四、循环语句for4.1 基本for循环for(初始化;条件;递增){// 循环体}示例for(int i0;i5;i){print(计数:$i);}4.2 遍历列表ListStringskills[Flutter,Dart,HarmonyOS,Java];for(int i0;iskills.length;i){print(技能${i1}:${skills[i]});}4.3 for-in循环for-in循环更简洁地遍历可迭代对象for(Stringskillinskills){print(技能:$skill);}4.4 forEach循环forEach方法是函数式编程风格的循环skills.forEach((skill){print(技能:$skill);});4.5 循环方式对比方式语法适用场景for循环for (int i 0; i n; i)需要索引的场景for-infor (item in list)简单遍历forEachlist.forEach((item) {})函数式编程风格五、循环语句while与do-while5.1 while循环while循环在循环开始前检查条件while(条件){// 循环体}示例int count0;while(count5){print(计数:$count);count;}遍历列表ListStringfruits[苹果,香蕉,橙子,葡萄];int index0;while(indexfruits.length){print(水果${index1}:${fruits[index]});index;}5.2 do-while循环do-while循环先执行循环体然后检查条件do{// 循环体}while(条件);示例int attempts0;do{print(尝试次数:${attempts1});attempts;}while(attempts3);5.3 while vs do-while特性whiledo-while执行顺序先判断条件再执行循环体先执行循环体再判断条件最少执行次数0次1次适用场景条件可能一开始就不满足至少需要执行一次六、跳转语句break与continue6.1 break语句break语句用于跳出当前循环for(int i0;i10;i){if(i5){break;}print(i $i);}输出i 0 i 1 i 2 i 3 i 46.2 continue语句continue语句用于跳过当前循环的剩余部分继续下一次循环for(int i0;i10;i){if(i%20){continue;}print(奇数:$i);}输出奇数: 1 奇数: 3 奇数: 5 奇数: 7 奇数: 96.3 带标签的break在嵌套循环中可以使用标签跳出外层循环outerLoop:for(int i0;i3;i){for(int j0;j3;j){if(i1j1){breakouterLoop;}print(($i,$j));}}输出(0, 0) (0, 1) (0, 2) (1, 0)七、条件表达式7.1 三目运算符三目运算符是if-else的简化形式条件?表达式1:表达式2示例int age25;Stringstatusage18?成年人:未成年人;print(年龄状态:$status);// 年龄状态: 成年人7.2 空合并运算符空合并运算符??用于处理可能为null的值String?username红目香薰;StringdisplayNameusername??匿名用户;print(显示名称:$displayName);// 显示名称: 红目香薰7.3 级联运算符级联运算符..允许在同一个对象上连续调用多个方法StringBufferbufferStringBuffer();buffer..write(Hello)..write( )..write(World)..writeln(!);print(buffer.toString());// Hello World!7.4 条件表达式实战bool isOnlinetrue;StringonlineTextisOnline?在线:离线;ColoronlineColorisOnline?Colors.green:Colors.grey;print(在线状态:$onlineText, 颜色:$onlineColor);八、实战根据性别显示不同图标8.1 需求分析在个人信息卡片应用中需要根据用户的性别显示不同的图标和颜色男性蓝色图标女性粉色图标其他灰色图标8.2 使用if-else实现staticString_getGenderIcon(Stringgender){if(gender男){return;}elseif(gender女){return;}else{return;}}staticString_getGenderColor(Stringgender){if(gender男){return蓝色 (#2196F3);}elseif(gender女){return粉色 (#E91E63);}else{return灰色 (#9E9E9E);}}8.3 使用switch实现staticString_getGenderIconSwitch(Stringgender){switch(gender){case男:return‍;case女:return‍;default:return‍;}}8.4 完整示例staticvoid_genderIconExample(){ListMapString,Stringusers[{name:付文龙,gender:男},{name:小红,gender:女},{name:张三,gender:男},{name:李四,gender:未知},];for(varuserinusers){Stringicon_getGenderIcon(user[gender]!);Stringcolor_getGenderColor(user[gender]!);print(${user[name]} | 性别: ${user[gender]} | 图标:$icon| 颜色:$color);}print(\n 使用switch版本 );for(varuserinusers){Stringicon_getGenderIconSwitch(user[gender]!);print(${user[name]} | 图标:$icon);}}输出结果付文龙 | 性别: 男 | 图标: | 颜色: 蓝色 (#2196F3) 小红 | 性别: 女 | 图标: | 颜色: 粉色 (#E91E63) 张三 | 性别: 男 | 图标: | 颜色: 蓝色 (#2196F3) 李四 | 性别: 未知 | 图标: | 颜色: 灰色 (#9E9E9E) 使用switch版本 付文龙 | 图标: ‍ 小红 | 图标: ‍ 张三 | 图标: ‍ 李四 | 图标: ‍8.5 在UI中的应用在Flutter Widget中可以这样应用Widget_buildGenderIcon(Stringgender){IconDataicon;Colorcolor;switch(gender){case男:iconIcons.person;colorAppColors.male;break;case女:iconIcons.person;colorAppColors.female;break;default:iconIcons.person_outline;colorAppColors.textHint;}returnIcon(icon,color:color,size:24);}九、异常处理9.1 try-catch-finallyDart使用try-catch-finally来处理异常try{// 可能抛出异常的代码}catch(e){// 捕获异常}finally{// 无论是否异常都会执行}示例try{int result10~/0;// 会抛出IntegerDivisionByZeroExceptionprint(结果:$result);}catch(e){print(捕获异常:$e);}finally{print(finally块执行);}9.2 捕获特定类型的异常try{// 可能抛出多种异常的代码}onFormatExceptioncatch(e){print(格式异常:$e);}onExceptioncatch(e){print(通用异常:$e);}catch(e){print(未知异常:$e);}9.3 重新抛出异常try{// 代码}catch(e){print(记录日志:$e);rethrow;// 重新抛出异常}十、控制流最佳实践10.1 保持条件简洁避免过于复杂的条件表达式应该拆分为多个变量// 不好的做法if(user.isActiveuser.age18user.email.isNotEmptyuser.phone.isNotEmpty){// ...}// 好的做法bool isEligibleuser.isActiveuser.age18;bool hasContactInfouser.email.isNotEmptyuser.phone.isNotEmpty;if(isEligiblehasContactInfo){// ...}10.2 提前返回在函数中使用提前返回可以减少嵌套// 不好的做法voidprocessUser(Useruser){if(user!null){if(user.isActive){// 处理逻辑}}}// 好的做法voidprocessUser(User?user){if(usernull||!user.isActive){return;}// 处理逻辑}10.3 避免深层嵌套过多的嵌套会降低代码可读性// 不好的做法if(condition1){if(condition2){if(condition3){// 代码}}}// 好的做法if(!condition1||!condition2||!condition3){return;}// 代码10.4 使用枚举代替字符串常量对于固定值的条件判断使用枚举更安全enumGender{male,female,other}voidprocessGender(Gendergender){switch(gender){caseGender.male:// 处理男性break;caseGender.female:// 处理女性break;caseGender.other:// 处理其他break;}}10.5 循环中避免重复计算在循环中避免重复计算不变的值// 不好的做法for(int i0;ilist.length;i){// 每次循环都计算list.length// ...}// 好的做法int lengthlist.length;for(int i0;ilength;i){// ...}十一、在鸿蒙平台的特殊考虑11.1 平台特定条件在鸿蒙平台开发时可能需要根据平台执行不同的代码importdart:io;voidconfigurePlatform(){if(Platform.isAndroid){// Android特定配置}elseif(Platform.isIOS){// iOS特定配置}elseif(Platform.isHarmonyOS){// 鸿蒙特定配置}}11.2 性能考虑在鸿蒙平台上循环的性能尤为重要避免在循环中创建对象使用const构造函数考虑使用List.generate代替手动循环11.3 异步控制流在处理异步操作时需要正确使用await和条件判断FuturevoidloadData()async{try{finaldataawaitfetchData();if(data!nulldata.isNotEmpty){setState((){_itemsdata;});}else{_showEmptyState();}}catch(e){_showError(e.toString());}}十二、总结控制流语句是Dart语言的基础掌握它们对于编写清晰、高效的代码至关重要。在本文中我们学习了条件语句if-else和switch的使用循环语句for、while、do-while的使用跳转语句break和continue的使用条件表达式三目运算符、空合并运算符异常处理try-catch-finally的使用实战示例根据性别显示不同图标最佳实践控制流设计的原则和规范鸿蒙平台特殊考虑平台特定代码和性能优化通过合理使用控制流语句我们可以编写出逻辑清晰、易于维护的Flutter代码为鸿蒙平台上的应用开发提供坚实的基础。附录完整示例代码完整的示例代码位于 [005_control_flow.dart](file:///d:/Flutter/flutter_harmonyos_study/lib/examples/chapter_01/section_1_1/005_control_flow.dart)包含了所有示例和实战代码。