【Flutter for OpenHarmony--Dart 入门日记】第3篇:基础数据类型全解析——String、数字与布尔值

【Flutter for OpenHarmony--Dart 入门日记】第3篇:基础数据类型全解析------String、数字与布尔值

作者 :灰灰勇闯IT
时间 :2026年1月
系列定位 :零基础记录 Dart 学习过程,适合编程新手、Flutter 初学者
本文重点 :掌握 Stringint/double/numbool 的声明、特性与使用技巧


目录

  • [1. 为什么需要明确的数据类型?](#1. 为什么需要明确的数据类型?)
  • [2. 字符串类型 String ------ 处理文本的利器](#2. 字符串类型 String —— 处理文本的利器)
    • [2.1 基本声明与引号选择](#2.1 基本声明与引号选择)
    • [2.2 字符串是可变的(作为变量时)](#2.2 字符串是可变的(作为变量时))
    • [2.3 模板字符串:优雅地嵌入变量](#2.3 模板字符串:优雅地嵌入变量)
  • [3. 数字类型:intdoublenum](#3. 数字类型:int、double 与 num)
    • [3.1 三者的区别与适用场景](#3.1 三者的区别与适用场景)
    • [3.2 声明与基本运算](#3.2 声明与基本运算)
    • [3.3 ⚠️ 赋值规则与类型转换陷阱](#3.3 ⚠️ 赋值规则与类型转换陷阱)
  • [4. 布尔类型 bool ------ 真假判断的基础](#4. 布尔类型 bool —— 真假判断的基础)
  • [5. 实战综合:一个"今日状态"小工具](#5. 实战综合:一个“今日状态”小工具)
  • [6. 常见误区与最佳实践](#6. 常见误区与最佳实践)
  • [7. 小结](#7. 小结)

1. 为什么需要明确的数据类型?

在 Dart 中,每个变量都有明确的类型。这不仅帮助编译器优化性能,还能在编码阶段就发现错误(比如把文字当成数字计算)。

Dart 的四大基础类型构成了我们日常开发的"原子":

  • String:用于姓名、消息、描述等文本
  • int / double / num:用于计数、价格、坐标等数值
  • bool:用于开关、完成状态、条件判断

🌟 我的感悟

类型就像给数据贴标签------"这是名字"、"那是年龄"、"这个是是否完成"。有了标签,程序才知道怎么正确处理它们。


2. 字符串类型 String ------ 处理文本的利器

2.1 基本声明与引号选择

String 用于表示一段文本。Dart 支持单引号 ' ' 和双引号 " ",两者完全等价。

dart 复制代码
void main() {
  String name = '小明';
  String greeting = "Hello, Dart!";
  print('$name says: $greeting');
}

输出:

复制代码
小明 says: Hello, Dart!

(图:使用 String 声明文本变量并输出)

建议:团队项目中统一使用一种引号(如单引号),保持代码风格一致。


2.2 字符串是可变的(作为变量时)

注意:String 本身是不可变对象(immutable),但作为变量时,可以重新赋值为新的字符串

dart 复制代码
void main() {
  String mood = '开心';
  print('今天心情:$mood');
  
  mood = '有点累'; // ✅ 合法!变量指向了新的字符串对象
  print('现在心情:$mood');
}

输出:

复制代码
今天心情:开心
现在心情:有点累

🔍 原理小知识

Dart 中所有 String 对象一旦创建就不能修改。mood = '新值' 实际是让变量 mood 指向一个全新的字符串对象。


2.3 模板字符串:优雅地嵌入变量

Dart 提供强大的字符串插值(String Interpolation) 功能,无需繁琐拼接。

语法:

  • $变量名:适用于简单标识符
  • ${表达式}:适用于复杂表达式或方法调用
示例:打印"我要在 XX 时间吃早饭"
dart 复制代码
void main() {
  String time = '7:30';
  
  // 方式1:简单变量
  String plan1 = '我要在$time的时候吃早饭';
  
  // 方式2:推荐!使用 ${} 更清晰安全
  String plan2 = '我要在${time}的时候吃早饭';
  
  print(plan1);
  print(plan2);
}

输出:

复制代码
我要在7:30的时候吃早饭
我要在7:30的时候吃早饭

💡 强烈建议

即使是简单变量,也优先使用 ${time} 而非 $time。原因:

  • 避免歧义(如 $timeAM 会被解析为变量 timeAM,而非 time + "AM"
  • 代码风格统一,便于维护

3. 数字类型:intdoublenum

3.1 三者的区别与适用场景

类型 含义 示例 适用场景
int 整数 42, -100 计数、索引、ID
double 浮点数(小数) 3.14, -0.5 坐标、价格、科学计算
num intdouble 的父类 可以是任意数字 通用数字处理函数

📌 注意num 是抽象类,不能直接实例化,但可作为参数或返回类型。


3.2 声明与基本运算

dart 复制代码
void main() {
  int count = 10;
  double price = 19.99;
  num total = count * price; // num 可以接收 int 或 double 运算结果

  print('数量:$count');
  print('单价:$$price');
  print('总价:$$total'); // 输出:$199.9
}

特点

  • intdouble 都继承自 num
  • 数学运算(+ - * /)会自动提升类型(如 int / int 结果是 double

3.3 ⚠️ 赋值规则与类型转换陷阱

Dart 是强类型语言,不同类型不能随意赋值!以下是关键规则:

赋值方向 是否允许 说明
intdouble ❌ 不允许 需显式转换
doubleint ❌ 不允许 会丢失精度
intnum ✅ 允许 intnum 子类
doublenum ✅ 允许 doublenum 子类
numint ❌ 不允许 需类型检查 + 转换
numdouble ❌ 不允许 同上
正确转换方式:
dart 复制代码
void main() {
  int a = 5;
  double b = a.toDouble(); // ✅ 显式转换
  int c = b.toInt();       // ✅ 截断小数部分(不是四舍五入!)

  num n = 3.14;
  if (n is double) {
    double d = n as double; // ✅ 安全转换
    print('π ≈ $d');
  }
}

⚠️ 重要提醒
b.toInt()截断 (truncate),不是四舍五入!

3.9.toInt() 结果是 3,不是 4


4. 布尔类型 bool ------ 真假判断的基础

bool 只有两个可能值:truefalse,常用于条件判断。

场景:记录作业是否完成
dart 复制代码
void main() {
  bool homeworkDone = false;
  print('作业完成了吗?${homeworkDone ? '是的!' : '还没呢...'}');

  // 假设现在完成了
  homeworkDone = true;
  print('现在完成了吗?${homeworkDone ? '搞定!' : '继续加油'}');
}

输出:

复制代码
作业完成了吗?还没呢...
现在完成了吗?搞定!

最佳实践

布尔变量命名建议以 ishascan 等开头,如 isLoggedInhasPermission,提高可读性。


5. 实战综合:一个"今日状态"小工具

结合所学,我们写一个小程序,展示今天的各种状态:

dart 复制代码
void main() {
  // 文本
  String userName = '小明';
  
  // 数字
  int studyHours = 3;
  double sleepHours = 7.5;
  
  // 布尔
  bool ateBreakfast = true;
  bool finishedHomework = false;

  // 输出
  print('=== $userName 的今日状态 ===');
  print('学习时长:${studyHours} 小时');
  print('睡眠时长:${sleepHours} 小时');
  print('吃早餐了吗?${ateBreakfast ? '吃了' : '没吃'}');
  print('作业完成了吗?${finishedHomework ? '完成了' : '还在努力'}');
  
  // 综合判断
  bool isGoodDay = ateBreakfast && sleepHours >= 7 && studyHours > 0;
  print('今天是充实的一天吗?${isGoodDay ? '是的!' : '明天加油!'}');
}

运行效果清晰展示了四种类型的协同工作!


6. 常见误区与最佳实践

❌ 误区1:"String 不能改,所以不能重新赋值"

→ 错!String 对象不可变,但变量可以指向新对象

❌ 误区2:"num 可以随便转成 intdouble"

→ 必须先用 is 检查类型,再用 as.toInt() 转换。

✅ 最佳实践:

  • 优先使用显式类型声明(如 String name = ...),而非 var
  • 模板字符串统一用 ${}
  • 数字运算注意类型提升(/ 总是返回 double
  • 布尔变量命名要有语义(避免 flag1, status2

7. 小结 & 下期预告

本篇收获

  • 掌握了 String 的声明、可变性与模板字符串用法
  • 理清了 intdoublenum 的关系与赋值规则
  • 学会了 bool 的基本使用与命名规范
  • 通过综合示例巩固了多类型协作

🎯 动手练习

尝试写一个"购物清单"程序,包含商品名(String)、单价(double)、数量(int)、是否已购买(bool),并计算总金额。


💬 互动时间

你在使用模板字符串时有没有遇到过 $ 解析错误?或者在数字类型转换时踩过坑?欢迎在评论区分享你的经历!如果你觉得这篇文章帮你理清了 Dart 基础类型,别忘了 点赞 + 收藏 + 关注,你的支持是我持续更新的最大动力!


📎 附:所有代码均可直接复制运行

开发环境:Dart SDK 3.0+,推荐使用 VS Code + Dart 插件


📌 图片上传提醒(重要!)

你提供的图片链接(如 https://i-blog.csdnimg.cn/direct/...无法在 CSDN 外部显示

✅ 正确做法:

  1. 保存好你的 .png 文件到本地
  2. 在 CSDN 编辑器中,点击"图片"按钮上传这些文件
  3. 按文中 [图片:描述] 的顺序上传即可,CSDN 会自动生成有效链接

继续加油!你已经掌握了 Dart 的"词汇表",下一步就是学会"造句"了 👨‍💻✨

相关推荐
Swift社区2 小时前
Java 实战 - 字符编码问题解决方案
java·开发语言
天天睡大觉2 小时前
python命名规则(PEP8编码规则)
开发语言·前端·python
重生之我是Java开发战士2 小时前
【Python】基础语法入门:变量,数据类型,运算符
开发语言·python
tobias.b2 小时前
408真题解析-2010-10-数据结构-快速排序
java·数据结构·算法·计算机考研·408真题解析
csbysj20202 小时前
PHP 数组排序
开发语言
季明洵2 小时前
力扣反转链表、两两交换链表中的节点、删除链表的倒数第N个节点
java·算法·leetcode·链表
2501_944521592 小时前
Flutter for OpenHarmony 微动漫App实战:底部导航实现
android·开发语言·前端·javascript·redis·flutter·ecmascript
猿小羽2 小时前
Java 架构演进史:从咖啡杯到云原生霸主
java·云原生·架构
chilavert3182 小时前
技术演进中的开发沉思-330 : 虚拟机命令行工具
java·jvm