Flutter常见数据类型及数据类型转换
简介
既然 Dart 是一门语言,那么就和我们所知道语言一样,有基本的数据类型以及常见的流程处理语法,那么我们就来了解下。
Dart 的所有东西都是对象,包括数字,函数等。它们都继承自 Object ,默认是都是 null(包括数字),所以数字,字符串都可以调用各种方法。
常亮与变量
变量
使用 var 声明变量,可赋予不同类型的值;未初始化时,默认值为 null ;使用 final 声明一个只能赋值一次的变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | void main(){ // 声明一个变量 a var a; print(a); // 打印 a 的值,显示为 null a = 10; print(a); // 打印出来的结果为 10 a = "测试字符串" ; print(a); // 打印出来的结果为 测试字符串 a = 30; print(a); // 打印出来的结果为 30 final b = 10; b = 20; // 这个会报错,有提示: [dart] 'b', a final variable, can only be set once. } |
常量
在 dart 中使用 const 声明常量;使用 const 声明的必须是编译期常量。
1 2 3 4 | void main(){ const a = 10; a = 20; // 这里也会报错:[dart] Constant variables can't be assigned a value. } |
在上面我们可以看到 dart 的一些简单的语法。其实和 js 蛮像,声明的变量的数据类型是随便去改变的,没有一个固定的数据类型(例如:java 这种语言)。其次就是 final 和 const 都可以声明变量,并且声明了变量之后都不能修改。
这里简单的说下 final 与 const 的区别:
final 要求变量只能初始化一次,并不要求赋的值一定是编译时常量,可以是常量也可以不是。而 const 要求在声明时初始化,并且赋值必需为编译时常量。
Dart中的内置类型
在Dart 有几种内置的数据类型:数值型-Number、布尔型-boolean、键值对-Map、字符串-String、列表-List、其他类型-Runes、Symbols
数值型
Dart 中只提供了两种类型:
num
1、整形int
2、浮点型double
1 2 3 4 5 6 7 8 9 10 11 | void main(){ num a = 10; // 整形 a = 20.1; // 浮点型 int i = 10; i = 10.1; // 这个地方会报错,因为将 int 型的数据改为 double 型 double d = 20.1; d = 20; // 这个地方会报错,因为将 double 型的数据改为 int 型 } |
从上面可以看到如果是使用 num 声明的变量,可以随意的转换类型,但是如果是使用了int 或者 double 明确的声明,那么就不能转换了
数值型的操作
运算符: +、 - 、* 、/ 、 ~/ 、 %
常用属性: isNaN、isEven、isOdd
常用方法:abs()、round()、floorl()、ceil()、toInt()、toDouble()
1 2 3 4 5 6 7 8 9 10 11 12 | // 由于常用的方法在其他语言中都有,就不过去的赘述,下面列出一些特殊的 void main(){ int i = 10; double d = 20.1; print(i/d); // 0.49751243781094523 print(i~/d); // 0 这个操作是取整 print( i.isOdd ); // 判断是奇数 print( i.isEven ); // 判断是偶数 } |
一些常见的转换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // String -> int var one = int.parse( '1' ); assert(one == 1); // String -> double var onePointOne = double.parse( '1.1' ); assert(onePointOne == 1.1); // int -> String String oneAsString = 1.toString(); assert(oneAsString == '1' ); // double -> String String piAsString = 3.14159.toStringAsFixed(2); assert(piAsString == '3.14' ); |
字符串
在 dart 中居然可以使用 单引号 和 双引号声明字符串。这两种方式都可以。
1 2 3 4 | void main(){ String string = '单引号声明字符串' ; String string1 = "双引号声明字符串" ; } |
在 String 中单、双引号互相嵌套的情况
1 2 3 4 5 6 7 8 9 10 11 12 | void main(){ String str = '单引号中的"双引号"' ; String str1 = "双引号中的'单引号'" ; print(str); print(str1); String str2 = '单引号中的 \'单引号\' ' ; String str3 = "双引号中的 \"双引号\" " ; print(str2); print(str3); } |
字符串拼接的方式
下面列出 dart 中拼接字符串的各种骚操作(黑魔法)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | void main(){ // 使用的是空格拼接,多个空格也可以 String str1 = '单引号空格字符串' '拼接' '~' ; // 单引号字符串空格拼接~ // 使用换行符以及空格 String str2 = '单引号符串' '换行了' '再加空格' '拼接' ; // 单引号符串换行了再加空格拼接 // 单双引号 空格拼接 String str3 = "单双引号空格字符串" '拼接' "~" ; // 单双引号字符串空格拼接~ // 单双引号 换行符以及空格 String str4 = "单双引号符串" '换行了' '再加空格' '拼接' ; // 单双引号符串换行了再加空格拼接 String str5 = '' ' 使用3个单引号、 看到我使用了么 ' '' ; String str6 = "" " 使用3个双引号、 看到我使用了么 " "" ; String str7 = "算了,还是正常一点" + ",使用 + 来拼接" ; } |
从上面可以看到 dart 中可以使用空格来做为拼接。所以我们继续研究下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | void main(){ // 拼接字符串, 输出:单引号空格 或者 双引号空格 String blockStr = '单引号' '空格' ; String blockStr1 = '单引号' '空格' ; String blockStr2 = "双引号" "空格" ; String blockStr3 = "双引号" "空格" ; // 下面这两种情况会报错 // String blockStr4 = '单引号''''空格'; // String blockStr5 = "双引号""""空格"; // 测试中间添加字符 String blockStr6 = '单引号' '_' '空格' ; // 输出:单引号_空格 String blockStr7 = "双引号" "#" "空格" ; // 注意不能使用 $,$会报错, 输出:单引号#空格 // 单双引号混合使用 String blockStr8 = '单""""引号' ; // 输出:单""""引号 String blockStr9 = '单""_""引号' ; // 输出:单""_""引号 // 单双引号混合使用 String blockStr10 = "双''''引号" ; // 输出:双''''引号 String blockStr11 = "双''_''引号" ; // 输出:双''_''引号 } |
${表达式}的使用
类似于JS中 ES6 上面的表达式的使用,感觉是相通的。
1 2 3 4 5 6 7 8 | void main(){ var flag = false ; var str = "测试字符串" ; print( "我们来验证字符串:${str}" "然后看看我们的 flag:${flag}" ); // 最后输出的结果为:我们来验证字符串:测试字符串然后看看我们的 flag:false } |
布尔值
assert 是语言内置的断言函数,仅在检查模式下有效
在开发过程中, 除非条件为真,否则会引发异常。(断言失败则程序立刻终止)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 检查是否为空 var fullName = '' ; assert(fullName.isEmpty); // 为0检查 var hitPoints = 0; assert(hitPoints <= 0); // 检查是否为 null. var unicorn; assert(unicorn == null ); // 检查是否为 NaN. var iMeantToDoThis = 0 / 0; assert(iMeantToDoThis.isNaN); |
List列表
实例化 List 的方法如下
1 2 3 4 5 6 7 8 9 10 11 12 | void main(){ // 使用构造创建 var list = new List(); //创建一个int类型的list List intlist = [1, 2, 3]; // 创建一个常量List, 不可以改变的List List constList = const[10, 7, 23]; } |
dart 中数组常用的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | void main(){ // 在数组中可以存放多个不同类型的对象 var list = [1, 2, 3, 'Flutter' , true ]; print(list); // 输出的结果:[1, 2, 3, Flutter, true] // 修改数组下标为2 的值 list[2] = 'Dart' ; print(list); // 输出的结果:[1, 2, Dart, Flutter, true] // 获取数组的长度 print(list.length); // 输出的结果:5 // 向数组中添加元素 list.add( "value" ); print(list); // 输出的结果:[1, 2, Dart, Flutter, true, value] // 向数组中的指定位置添加元素 list.insert(1, 'element' ); print(list); // 输出的结果:[1, element, 2, Dart, Flutter, true, value] // 移除数组中的元素 list.remove( "value" ); print(list); // 输出的结果:[1, element, 2, Dart, Flutter, true] // 移除数组中指定的元素 list.removeAt(1); print(list); // 输出的结果:[1, 2, Dart, Flutter, true] // 判断数组中是否有某个元素 print(list.indexOf( "element" )); // 输出结果:-1 // 可以使用 sort() 函数来排序, 但是由于我们使用定义的数组类型不一样,就不能使用 var intlist = [1, 2, 5, 6 ,3]; // 根据语法提示: List.sort([(int, int) → int compare]) → void intlist.sort( (a, b) => a.compareTo(b) ); print(intlist); // 输出结果:[1, 2, 3, 5, 6] } |
map 集合
创建 Map 集合
1 2 3 4 5 6 7 8 9 10 11 | void main(){ // 创建Map var language = { 'fisrt' : 'dart' , 'second' : 'java' }; // 创建不可变的 Map var constLanguage = const { 'fisrt' : 'dart' , 'second' : 'java' }; // 通过构造器创建 var initLanguage = new Map(); } |
Map 中常用的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | void main(){ // 创建Map var map = { 'fisrt' : 'dart' , 'second' : 'java' }; // 获取长度 print(map.length); // 输出结果:2 // 判断是否为空 print(map.isEmpty); // 输出结果:false print(map.isNotEmpty); // 输出结果:true // 获取到所有的 key print(map.keys); // 输出结果:(fisrt, second) // 获取到所有的 values print(map.values); // 输出结果:(dart, java) // 判断是否包含某个key print(map.containsKey( "key" )); // 输出结果:false // 判断是否包含某个value print(map.containsValue( "key" )); // 输出结果:false // 添加一个新的元素进去 map[ 'third' ] = 'key' ; print(map); // 输出结果:{fisrt: dart, second: java, third: key} // 循环打印 代码提示:Map.forEach((String, String) → void f) → void map.forEach( (key, value) => getMap(key, value) ); } void getMap(key, value){ print( "key:${key}, value:${value}" ); } |
dynamic 关键字
这个关键字就类似定义我们在 JS 中定义变量的情况。先看下面的代码
1 2 3 4 5 6 7 8 9 10 | void main(){ // a 的数据类型可以随意改变,这种类型就是 dynamic var a ; a = 10; a = "dart" ; // 这里我们使用 dynamic 声明 dynamic d = 10; d = 'dart' ; } |
原文地址:https://blog.csdn.net/qq_18948359/article/details/82749659
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析