天天看点

Flutter入门第一步-Dart语言入门(一)Flutter入门第一步-Dart语言入门(一)

Flutter入门第一步-Dart语言入门(一)

最近学习flutter的时候,看了下官方文档里的示例代码,看得我一头雾水,就像是雾里看花(此处@东北酱)。在我个人看来,Dart语言的语法有点像是java和js的结合体,如果熟悉java的胖友学起来应该不会太费力。所以磨刀不误砍柴工,我先学一点基础的Dart语言,然后再开始我的fluter之旅。

参考资料:https://blog.csdn.net/weixin_33775582/article/details/91377034

http://www.cndartlang.com/669.html

1.工具

我个人使用了一个在线的编译工具 DartPad,当然了也有可供本地使用的IDE,自行下载吧。

2.Helloword!

在学习一门新的语言时,我们一般干的第一件事就是输出一个helloword,Dart也不例外。在Dart中输出helloword很简单。

Flutter入门第一步-Dart语言入门(一)Flutter入门第一步-Dart语言入门(一)

习惯了JAVA的人可能会比较疑惑,为什么会有单引号也可以。且往下看

3.数据类型

首先我们需要明确一点,Dart是是一个纯正的面向对象的动态类型的语言。Dart中所有东西都是对象,包括数字、函数等它们都继承自Object,并且默认值都是null(包括数字)因此数字、字符串都可以调用各种方法

Dart中支持以下数据类型:

Numbers

Strings

Booleans

List(也就是数组)

Maps

首先我们看下字符串,字符串赋值的时候,可以使用单引号,也可以使用双引号(如上面的helloword)。但需要注意的一点是,在使用单引号时,可以内嵌双引号,在使用双引号时,可以内嵌单引号。但使用单引号时不能内嵌单引号,双引号也是同理,否则需要加转义符来转义。

如下:

Flutter入门第一步-Dart语言入门(一)Flutter入门第一步-Dart语言入门(一)

其次,我们在做字符串拼接的时候,可以省略 +号了。当然了也可以使用+。这是因为在之前版本的SDK中不支持用+连接字符串。

Flutter入门第一步-Dart语言入门(一)Flutter入门第一步-Dart语言入门(一)

当我们需要输出一个变量的值时候,我们需要加一个$符。如

Flutter入门第一步-Dart语言入门(一)Flutter入门第一步-Dart语言入门(一)

当我们不需要转义的时候,我们可以在要输出的句子之前加一个r,注意r一定要挨着引号,不然会报错。

Flutter入门第一步-Dart语言入门(一)Flutter入门第一步-Dart语言入门(一)

4.关键字:const final

const 定义的是编译时常量,只能用编译时常量来初始化

final 定义的常量可以用变量来初始化

var、final等在左边定义变量的时候,并不关心右边是不是常量

但是如果右边用了const,那么不管左边如何,右边都必须是常量

5.函数

首先我们需要明确一点,在Dart中,函数也是一个对象当我们的函数没有返回值时,会返回一个null.我们以这个方法为例:

void main() {
  
  var name = getName("panghu");
  print(name);
  
}

String getName(String name)
{
  return "name is $name";
}
           

由于Dart语言是动态类型的,我们也可以把它改成这样:

void main() {
  
  var name = getName("panghu");
  print(name);
  
}

 getName( name)
{
  return "name is $name";
}
           

不过这样的代码会在我们的时候难度变得很大。如果函数只是简单的返回一个表达式的值,可以使用箭头语法:

void main() {
  
  var name = getName("panghu");
  print(name);
  
}

 getName( name)=>"name is $name";
           

然后看下面的这段代码:

var callbacks = [];
for (var i = 0; i < 3; i++) {
  // 在列表 callbacks 中添加一个函数对象,这个函数会记住 for 循环中当前 i 的值。
  callbacks.add(() => print('Save $i')); 
}
callbacks.forEach((c) => c()); // 分别输出 0 1 2
           

当在for循环中调用add方法时,我们加入到数组中的是一个函数的对象。然后再下方的foreach循环中,我们每次遍历的时候执行了一遍c这个对象(函数)的方法本身。

可选参数函数,Dart语言支持两种可选参数函数:1.命名可选参数 2.位置可选参数。

命名可选参数使用大括号{},默认值用冒号:

位置可选参数使用方括号[],默认值用等号=

特点:

命名可选参数:大括号外是必选参数,大括号里是可选参数,且按照key:value的形式进行复制,不限定位置。

位置可选参数:方括号外是必选参数,方括号内是可选参数,且按照形参的顺序,以key=value的形式进行赋值。

看下面的例子

FunX(a, {b, c:3, d:4, e})
{
  print('$a $b $c $d $e');
}

FunY(a, [b, c=3, d=4, e])
{
  print('$a $b $c $d $e');
}


void main()
{
  FunX(1, b:3, d:5);
  FunY(1, 3, 5);
}
           

我们输出的结果是:

1 3 3 5 null
1 3 5 4 null
           

函数闭包

这个概念对于js开发者应该是不会陌生,但对于java开发者来说却是不太熟悉。

我们看下面这个例子:

Function makeSubstract(num n)
{
  return (num i) => n - i;
}

void main()
{
  var x = makeSubstract(5);
  print(x(2));
}
           

我尝试给大家分析一下:在makeSubstract中,我们返回了一个Function 类型的对象,也就是返回了一个函数,更确切的说我们把一个匿名函数的定义放在了makeSubstract函数体中。所以在main函数中,我们的x其实是一个函数对象,它其实是这个样子的:

int x(num i)
{
return 5-i;
}
           

函数别名: 看下面的例子

typedef int Compare(Object a, Object b);
 
class SortedCollection {
  Compare compare;
 
  SortedCollection(this.compare);
}
 
// Initial, broken implementation.
int sort(Object a, Object b) => 0;
 
void main() {
  SortedCollection coll = new SortedCollection(sort);
  assert(coll.compare is Function);
  assert(coll.compare is Compare);
}
           

关于函数和类型就到这里,下篇文章我们看一下Dart的别的部分