专栏名称: 小码农沐枫
屌丝♬(ノ゜∇゜)ノ♩
目录
相关文章推荐
参考消息  ·  美乌通话内容公开,泽连斯基发声 ·  10 小时前  
参考消息  ·  诺奖得主:“美国的话一文不值了” ·  20 小时前  
参考消息  ·  俄国防部:机组人员全部遇难 ·  昨天  
参考消息  ·  哪吒热不减,中国一新产业正在崛起! ·  昨天  
51好读  ›  专栏  ›  小码农沐枫

Flutter学习笔记--Dart基础

小码农沐枫  · 掘金  ·  · 2019-08-30 05:35

正文

阅读 113

Flutter学习笔记--Dart基础

前言

Flutter使用Dart语言开发, Dart是面向对象编程语言, 由Google2011年推出, 目前最新版本是2.4.0.

工欲善其事,必先利其器.

为了更好的开发Flutter应用, 我们先来熟悉一下Dart的基本语法

Hello, world!

学习任何一门编程语言时, 基本上都是输出一个Hello, world!

本文档采用的编辑器是Android Studio(因为本人是做Android开发的)进行开发

新建dart_demo.dart文件, Dart程序是从main()函数开始执行的,代码如下:

void main(){
  print('Hello, world!');
}
复制代码

编辑完成后, 点击右键菜单中的Run菜单便可以运行Dart文件

数据类型

Dart中所有东西都是对象, 包括数字、函数等
它们都继承自Object, 并且默认值都是null(包括数字)因此数字、字符串都可以调用各种方法

Dart中支持以下内建类型:

  • String
  • Number
  • Boolean
  • List
  • Set
  • Map
  • Rune
  • Symbol

Drat语言本质上是动态类型语言, 类型是可选的, 可以使用var声明变量, 也可以使用类型来声明变量

1. String

Dart字符串是一组UTF-16单元序列. 字符串赋值的时候, 可以使用单引号, 也可以使用双引号

var str1 = "MuFeng";
String str2 = 'MuFeng';
复制代码

如果使用的是双引号, 可以内嵌单引号, 如果使用的是单引号, 可以内嵌双引号, 否则需要"\"转义

var str1 = "My name is 'MuFeng'";
var str2 = 'My name is "MuFeng"';
var str3 = "My name is \"MuFeng\"";
复制代码

使用三个单引号或者三个双引号可以多行字符串赋值

var str5 = '''MuFeng Study
Dart for Flutter!
''';
var str6 = """MuFeng Study
Dart for Flutter!
""";
复制代码

在Dart中, 相邻的字符串在编译的时候会自动连接, 这里出现一个问题, 如果多个字符串相邻, 中间的字符串不能为空, 否则会报错, 但是如果单引号和双引号相邻, 即使是空值也不会报错

var name = 'Mu''''Feng';//报错
var name1 = 'Mu'""'Feng';//不会报错
复制代码

assert 是语言内置的断言函数, 仅在检查模式下有效, 如果断言失败则程序立即终止

assert(name == "MuFeng");
复制代码

Dart中字符串拼接的三种方式:

  1. 采用"+"拼接
  2. 采用上面说的"相邻的字符串自动连接"
  3. 采用" "插入变量的值, 也可以采用" {}"插入表达式
var name = "MuFeng";
print("My name is $name");
复制代码

声明原始字符串, 直接在字符串前加字符"r", 可以避免"\"的转义作用, 在正则表达式中很有用

print(r"换行符: \n");
复制代码

2. Number

Dart中的Number有两种类型:

int
整数值不大于64位, 具体取决于平台. 在Dart VM上, 值的范围从-2 63 到2 63 -1. Dart被编译为JavaScript时, 值的范围从-2 53 到2 53 -1

double
64位双精度浮点数

字符串与数字的转换方法:

//String->int
var a = int.parse('1);
//String->double
var a = double.parse(1.1);
//int->String
var a = 1.toString();
//double->String 并支持设置保留几位小数点
var a = 1.23456.toStringAsFixed(2)//==1.23

var h = 59506490075;
//进制转换方法
print("整型转换为16进制: $h -> 0x${h.toRadixString(16).toUpperCase()}");
复制代码

3. Boolean

Dart使用bool类型表示布尔值.

var isShow = true;
bool isHide = false;
复制代码

4. List

列表, 也叫数组, 常见的添加、索引、删除等方法

//使用List的构造函数, 也可以添加int参数, 标识list固定长度
  var list = List();
  var list1 = List(10);

  //使用简单的List来赋值
  var list2 = ['a','b',1];

  //添加元素
  list.add(2);

  //添加多个元素
  list.addAll(list2);

  //获取List的长度
  print(list.length);

  //利用索引获取元素
  print(list[0]);

  //查找某个元素的索引号
  print(list.indexOf('b'));

  //利用索引号删除某个元素
  var index = list.indexOf(1);
  list.removeAt(index);
  print(list);

  //删除所有元素
  list.clear();
  print(list.length);
复制代码

使用sort()对List的元素进行排序
并且必须制定比较两个对象的函数, 函数的返回值中
return < 0 表示小于, =0表示相同, >0表示大于

var list3 = ['c','a','r','y'];
  list3.sort((a,b)=>a.compareTo(b));
  print(list3);
复制代码

List以及其他的容器可以指定参数类型

var list = List<String>();
list.add("a");
list.add(5);//报错, 指定参数类型后, 类型必须统一
复制代码

5. Set

集合在Dart中无序的, 并且每个元素具有唯一性, 因为它是无序的, 因此不能像List那样用索引来访问元素

void main(){
  var set = Set();

  set.addAll(['name', 'sex', 'age']);
  print(set.length);

  //添加已有的元素无效
  set.add("name");
  print(set.length);

  //删除元素
  set.remove("sex");
  print(set);

  //检查Set中是否包含某个元素
  print(set.contains("name"));

  //检查在Set中是否包含多个元素
  print(set.containsAll(["name","age"]));
  set.addAll(['name', 'sex', 'age']);

  //获取两个集合的交集
  var set1 = Set.from(['name','MuFeng']);
  var set2 = set.intersection(set1);
  print("set2 = $set2");

}
复制代码

6. Map

映射, 也称之为字典, Map是一个无序的键值对容器

void main(){
  //Map的声明
  var map = {
    "name": "MuFeng",
    "age": 25,
    "la": ["Android", 'Java','Kotlin','Flutter']
  };
  var map1 = Map();

  //指定键值对的参数类型
  var map2 = Map<String, Object>();

  //Map的赋值, 中括号中是Key, 这里不是数组
  map["sex"] = "男";

  //Map中的键值对是唯一的
  //同Set不同, 第二次输入的Key如果存在, Value会覆盖之前的数据
  map["age"] = 30;
  print(map);

  //检索Map是否包含有某Key
  print(map.containsKey("age"));

  //删除某个键值对
  map.remove("sex");
  print(map);
}
复制代码

可以使用getKeys和getValues获取所有Key或者所有Values的迭代器

 var keys = map.keys;
  print(keys);

  var values = map.values;
  print(values);

  //迭代器中有一个函数any, 用来检测迭代器中的数据
  //当其中一个元素运行函数时return true, 那么any的返回值就是true, 否则为false
  //与之相对的是函数every, 要所有函数运行return true, 那么every返回true
  print(values.any((v) => v == 'MuFeng'));
  print(values.every((v) => v == 'MuFeng'));

  //可以使用forEach来遍历数据, 但它是无序的
  map.forEach((k,v){
    print("$k and $v");
  });

  //检索是否包含某个key或value
  print(map.containsKey("name"));
  print(map.containsValue("MuFeng"));

  //V putIfAbsent(K key, Function V ifAbsent())函数, 通过key来查找Value
  //当某个Key不存在的时候, 会执行第二参数的Function来添加Value
  var map3 = {};
  map3.putIfAbsent("name", ()=>'MuFeng');
  print(map3);
复制代码

函数

1. 函数定义

函数也是对象, 当没有指定返回值的时候, 函数返回null

String sayHello(String name){
  return 'Hello, $name!';
}
main(){
  assert(sayHello is Function, "类型判断错误");
  print(sayHello("MuFeng"));
}
复制代码

注意: 断言函数assert(), Debug模式下, 当表达式的值为false时抛出异常, 在新版SDK中, assert()添加了第二个参数message, 用于在抛出异常的时候, 输出具体信息

因为Dart中类型是可选的, 也可以这样写

sayHello(name){
    return "Hello, $name!";
}
复制代码

不过建议明确函数的输入类型和返回值类型, 这样方便修改,方便阅读

如果函数只是简单的返回一个表达式的值, 可以使用箭头语法"=>expr;", 它等价于"{return expr;}", 所以上面的函数可以这么修改:

sayHello(name) => "Hello, $name!";
复制代码

Dart中匿名函数的写法"()=>expr;" 定义匿名函数:

var sayHello = (name) => "Hello, $name!";
复制代码






请到「今天看啥」查看全文