Dart语言(flutter)笔记

基础篇

void main(List<String> args) {
  //变量var
  var age = 10;
  print(age);
  
  //常量const
  const pai = 3.1415926;
  print(pai);

  //常量final
  final time =DateTime.now();
  print(time);

  //字符串 String
  String text = "不错";
  text = "有错";
  print(text);
  print("我要在${DateTime.now()}时间吃饭");
  print("你有错没?我$text");

  //Dart中的数字类型-int/num/double
  int a = 2 ;
  num b = 1.5;
  double c = 1.5;
  a = c.toInt();//不难直接赋值a=c
  c = a.toDouble();
  b  = a ;
  b  = c ;
  var aa= a+b+c;
  print(aa);

  //布尔 bool
  bool a1 = false;
  bool a2 = true ;
  print(a1);
  print(a2); 

  //---------------------------------------------------------------------

  //列表list
  List students = [1,2,3,4,5];
  print(students);
  List students1 = [31,312,4234,4123];
  print(students1);
  students.add("6");//尾部添加
  students.add(students1);//尾部添加列表
  students.remove(1);//删除符合条件的
  students.removeLast();//删除最后一个
  students.removeRange(0, 3);//删除范围值
  //操作列表
  List students2 = ["张三","李四","李五","赵六"];

  students2.forEach((item){
    print(item);
  });//输出张三李四李五赵六

  print(
    students2.every((item){
      return item.startsWith("李");//返回是不是都是姓李的,都是姓李为真,反之为假。
    })
  );//输出false

  print(
    students2.any((item){
      return item.startsWith("李");//返回是不是有一个姓李的,有一个姓李为真,反之为假。
    })
  );//输出true

  print(
    students2.map((item){
      return item.startsWith("李");//返回是不是有一个姓李的,有一个姓李为真,反之为假。
    })
  );//输出[false, true, true, false]

  students2.where((item){
      return item.startsWith("李");//返回所有姓李的
    }).toList();//输出[李四, 李五]
  
  //列表属性
  print(students2.length);//输出4 长度
  print(students2.first);//输出张三 首个元素
  print(students2.last);//输出赵六  最后元素
  print(students2.isEmpty);//输出false  是否为空
  print(students2.isNotEmpty);//输出true  是否不为空
  print(students2.indexOf("李四"));//输出1  第一个李四的索引
  print(students2.contains("李四"));//输出true  是否包含李四
  print(students2.reversed);//输出(赵六, 李五, 李四, 张三)  反转
  print(students2.sublist(0, 2));//输出[张三, 李四]  截取子列表
  print(students2.sublist(2));//输出[李五, 赵六]  截取子列表从索引2开始到结束
  print(students2.sublist(2, 4));//输出[李五, 赵六]  截取子列表从索引2开始到索引4结束
  print(students2.sublist(2, 2));//输出[]  截取子列表从索引2开始到索引2结束,不包含索引2

  //---------------------------------------------------------------------

  //字典map {key:value}
  Map map = {"name":"张三","age":10};
  Map map1 = {"name":"王二","age":11};
  print(map["name"]);//输出张三
  print(map["age"]);//输出10
  map["age"] = 11;//修改值
  map.remove("age");//删除键值对

  map.forEach((key, value) {
    print("$key:$value");//遍历全部键值对
  });//输出name:张三

  map.addAll(map1);//合并map1到map
  print(map);//输出{"name":"张三","age":10,"name":"王二","age":11}

  print(map.containsKey("name"));//输出true  是否包含键name
  print(map.containsValue("张三"));//输出true  是否包含值张三
  
  map.clear();//清空map
  print(map);//输出{}

  //---------------------------------------------------------------------
  
  //Dart中的动态类型-dynamic
  dynamic a3 = 10;
  print(a3);
  a3 = "你好";
  print(a3);
  a3 = true;
  print(a3);

  //空安全操作符   ?可空类型   ?.安全访问   !.非空断言   ?? 空合并
  String? nameaa = null;
  nameaa?.substring(0, 1);//安全访问(客观)
  nameaa!.substring(0, 1);//非空断言(主观-开发者认为一定但报错还得报错)
  
  String name1 = nameaa ?? "默认值";//空合并
  print(name1);//输出默认值

  //单分支 双分支 多分支
  int aaa = 10;
  if(aaa > 0){
    print("大于0");
  }
  int aaa1 = 10;
  if(aaa1 > 0){
    print("大于0");
  }else{
    print("小于等于0");
  }
  int aaa2 = 10;
  if(aaa2 > 0){
    print("大于0");
  }else if(aaa2 == 0){
    print("等于0");
  }else{
    print("小于0");
  }

  //三目运算符
  int aaa3 = 10;
  String result = aaa3 > 0 ? "大于0" : "小于等于0";
  print(result);//输出大于0

  //switch语句
  int aaa4 = 10;
  switch(aaa4){
    case 1:
      print("1");
      break;
    case 2:
      print("2");
      break;
    default:
      print("其他");
  }

  //while循环 continue和break
  int aaa5 = 10;
  while(aaa5 > 0){
    if(aaa5 == 5){
      continue;//跳过5
    }
    print(aaa5);
    aaa5--;
  }

  //for循环
  for(int i = 0;i<10;i++){
    print(i);
  }

  //函数定义
  int add(int ad,int ba){//有返回值的定义
    return ad+ba;
  }
  void printInfo(String name,int age){//无返回值的定义
    print("姓名:$name,年龄:$age");
  }
  getvalue(){
    return "123";
  }
}

void main(List<String> args) {
  print(command("add","1"));//输出add1
  showPerson("张三",age: 10,sex: "男");//输出姓名:张三,年龄:10,性别:男
  showInfo(text);//输出我是text函数
  print(add(1,2));//输出3

}

Function text = (){
  print("我是text函数");
};

void showInfo(Function f){
  f();
}
int add(int a,int b)=>a+b;//箭头函数,返回a+b
String command(String a,[String? b = "12",String? c]){//可选参数
    return a+ (b ?? "")+ (c ?? "");
}
showPerson(String name,{int? age,String? sex}){//命名参数
  print("姓名:$name,年龄:$age,性别:$sex");
}

代码细节

变量与常量(最基础的存数据)

var age = 10;        // 变量:可以随时改值,Dart 自动识别类型(这里是int)
const pai = 3.1415926;// 编译时常量:值必须写死,运行时不能改(比如不能用DateTime.now())
final time = DateTime.now();// 运行时常量:值可以在运行时确定(比如当前时间),一旦赋值就不能改
核心区别:var 是 “可变的盒子”,const/final 是 “封死的盒子”(const 更严格)。

字符串(存文字)

String text = "不错";
text = "有错";
print("我要在${DateTime.now()}时间吃饭"); // 字符串插值:用${}把变量/表达式嵌进字符串
print("你有错没?我$text"); // 简单变量可以省略大括号,效果和上面一样
关键:Dart 字符串用双引号,插值是最常用的拼接方式,比 + 号方便。

数字类型(存数字)

int a = 2 ;     // 整数(只能存整数,比如1、10,不能存1.5)
num b = 1.5;    // 通用数字(既能存整数,也能存小数)
double c = 1.5; // 小数(只能存带小数点的数)
a = c.toInt();  // 小数转整数(不会直接赋值,必须用toInt())
c = a.toDouble();// 整数转小数
核心:不同数字类型不能直接赋值,需要手动转换(比如 double 不能直接给 int)。

布尔类型(存真假)

bool a1 = false; // 假
bool a2 = true ; // 真
只有 true/false 两个值,没有 “0 代表假、非 0 代表真” 的说法(和 Java/JS 不一样)。

列表 List

List students = [1,2,3,4,5];
// 增删操作
students.add("6");       // 末尾加一个元素
students.remove(1);      // 删除第一个等于1的元素
students.removeLast();   // 删除最后一个元素
students.removeRange(0,3);// 删除索引0到2的元素(左闭右开,不包含3)

// 遍历/判断操作(重点)
students2.forEach((item)=>print(item)); // 遍历每个元素并打印
students2.every((item)=>item.startsWith("李")); // 判断:是不是所有元素都姓李?(false)
students2.any((item)=>item.startsWith("李"));   // 判断:有没有至少一个姓李?(true)
students2.map((item)=>item.startsWith("李"));   // 转换:每个元素返回“是否姓李”的布尔值
students2.where((item)=>item.startsWith("李")); // 筛选:只保留姓李的元素

// 列表属性(查信息)
students2.length;    // 长度(4)
students2.first;     // 第一个元素(张三)
students2.last;      // 最后一个元素(赵六)
students2.indexOf("李四"); // 找“李四”的索引(1)
students2.sublist(0,2);    // 截取子列表(索引0到1,[张三,李四])
核心:列表是 “有序的一组数据”,可以增删改查,every/any/map/where 是最常用的操作方法。

字典 Map(存键值对,比如 “姓名 – 张三”)

Map map = {"name":"张三","age":10};
print(map["name"]);    // 查:通过key取value(张三)
map["age"] = 11;       // 改:修改key对应的value
map.remove("age");     // 删:删除某个键值对
map.forEach((k,v)=>print("$k:$v")); // 遍历:打印所有key和value
map.addAll(map1);      // 合并:把map1的内容加到map里
map.containsKey("name"); // 判断:有没有name这个key?(true)
map.clear();           // 清空:删除所有键值对
核心:Map 是 “键值对” 形式,key 唯一,通过 key 找 value 最常用。

动态类型 & 空安全(Dart 2.12 + 重点)

dynamic a3 = 10;
a3 = "你好"; // dynamic可以随便改类型(不推荐,失去类型校验)

String? nameaa = null; // ?:表示这个变量可以为空
nameaa?.substring(0,1); // ?.:安全访问,null的话不执行,不会报错
nameaa!.substring(0,1); // !.:非空断言,开发者保证非null,null的话会报错
String name1 = nameaa ?? "默认值"; // ??:空合并,null的话用默认值
空安全核心:防止 “空指针报错”,? 允许为空,?. 安全调用,?? 给默认值。

流程控制(代码的 “选择 / 循环”)

// 条件判断:if/三目/switch
if(aaa > 0) print("大于0"); // 单分支
String result = aaa3 > 0 ? "大于0" : "小于等于0"; // 三目(简化if-else)
switch(aaa4){ // 多分支匹配
  case 1: print("1"); break;
  default: print("其他");
}

// 循环:while/for
while(aaa5 > 0){ // 先判断条件,再执行
  if(aaa5 ==5) continue; // 跳过当前循环(不打印5)
  print(aaa5);
  aaa5--;
}
for(int i=0;i<10;i++) print(i); // 固定次数循环(打印0-9)
核心:continue 跳过本次循环,break 终止整个循环;switch 要加 break,否则会 “穿透”。

函数定义(封装可复用的代码)

int add(int ad,int ba){ // 有返回值:返回int类型,参数也要指定类型
  return ad+ba;
}
void printInfo(String name,int age){ // 无返回值:用void
  print("姓名:$name,年龄:$age");
}
getvalue(){ // 省略返回值类型:Dart自动推断(不推荐)
  return "123";
}
核心:函数是 “能重复调用的代码块”,指定参数 / 返回值类型更规范。

command 函数(可选参数)

String command(String a,[String? b = "12",String? c]){//可选参数
  return a+ (b ?? "")+ (c ?? "");
}
核心特点:可选参数用 [] 包裹,意思是 “可传可不传”。
a必选参数:调用时必须传值(比如示例里的 "add");
b带默认值的可选参数:不传的话默认用 "12",传了就用传的值(示例里传了 "1",覆盖默认值);
c无默认值的可选参数:不传的话就是 null,所以用 ?? "" 处理(空值就用空字符串,避免拼接报错)。

调用效果command("add","1") → 拼接 a("add") + b("1") + c("") → 返回 "add1",打印出来。

showPerson 函数(命名参数)

showPerson(String name,{int? age,String? sex}){//命名参数
  print("姓名:$name,年龄:$age,性别:$sex");
}
核心特点:命名参数用 {} 包裹,调用时必须写参数名(age: 10 而不是直接写 10),好处是参数顺序可以随便换,可读性更高。
name 是必选参数:必须传;
age/sex 是命名参数:传的时候要写 age:/sex:

调用效果showPerson("张三",age: 10,sex: "男") → 打印 "姓名:张三,年龄:10,性别:男"

函数作为参数传递(text 变量 + showInfo 函数)

// 把一个无参函数赋值给变量text(函数也是一种数据类型)
Function text = (){
  print("我是text函数");
};

// 接收一个函数类型的参数f,然后执行这个函数
void showInfo(Function f){
  f();
}
核心特点:Dart 里函数可以像数字、字符串一样,赋值给变量,也能当作参数传给其他函数。
text 是一个函数变量:存了一个 “打印指定文字” 的无参函数;
showInfo 接收函数参数:参数 f 是函数类型,调用 f() 就是执行传进来的函数。

调用效果showInfo(text) → 把 text 这个函数传给 showInfo,执行后打印 "我是text函数"

add 函数(箭头函数)

int add(int a,int b)=>a+b;//箭头函数,返回a+b

//核心特点:箭头函数是 Dart 对 “逻辑简单的函数” 的简化写法,相当于:
int add(int a,int b){
  return a+b;
}
只有一行返回逻辑时,用 => 替代 {}return,代码更简洁。
调用效果add(1,2) → 返回 3,打印出来。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇