暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Flutter系列1-Dart基础语法

方家小白 2019-11-12
420

Dart语法

面向对象的语言。

语言特性

  • Dart所有的东西都是对象,所有对象都继承自Object类。
  • Dart动态类型语言,尽量给变量定义一个类型,会更安全,没有显示定义类型的变量在debug的时候会是dynamic的。
  • Dart在运行之前会解析所有代码,指定数据类型和编译时的常量,可以提供运行速度。
  • Dart中的类和接口是统一的,类即是接口,你可以继承一个类,也可以实现一个类(接口)
  • Dart提供了顶级函数
  • Dart没有public,private,protected字段,变量名以_开始的意味着它的lib是私有的。
  • Dart未初始化的变量都会被赋值为null。
  • final的值只能被绑定一次,实例变量可以是final的,但是不能是const
  • const 是一个编译时的常量. var arr = const[];
    注意arr是变量,赋了一个常量值,也可以被赋其他的值。

关键字

关键字---
abstractdoimportsuper
asdynamicinswitch
assertelse-sync*
enumimplementsisthis
async*exportlibrarythrow
awaitexternalmixintrue
breakextendsnewtry
casefactorynulltypedef
catchfalseoperatorvar
classfinalpartvoid
constfinallyrethrowwhile
continueforreturnwith
covariantgetsetyield*
defaultifstaticdeferred

变量和常量

  • 声明变量
// 没有明确类型,编译的时候根据值明确类型
var name = ‘Bob’;
Object name = '张三';
dynamic name = '李四';

// 显示声明将被推断类型, 可以使用String显示声明字符串类型
String name = 'Bob' ;

  • 变量的初始值
 //测试 数字类型的初始值是什么?
int lineCount;
// 为false的时候抛出异常
assert(lineCount == null);
print(lineCount); //打印结果为null,证明数字类型初始化值是null

  • final and const

被final修饰的顶级变量或类变量在第一次声明的时候就需要初始化。被final或者const修饰的变量,变量类型可以省略,建议指定数据类型。被 final 或 const 修饰的变量无法再去修改其值。flnal 或者 const 不能和 var 同时使用。常量如果是类级别的,请使用 static const 在常量表达式中,该运算符的操作数必须为'bool'、'num'、'String'或'null', const常量必须用conat类型的值初始化。

//可以省略String这个类型声明
final name = "Bob";
final String name1 = "张三";

const name2 = "alex";
const String name3 = "李四";
name3 = '王五'; //报错。

const var String outSideName = 'Bill';//报错。
final var String name = 'Lili';//报错。
// 常量如果是类级别的,请使用 static const
static const String name3 = 'Tom';

const String outSideName = 'Bill';
final String outSideFinalName = 'Alex';
const String outSideName2 = 'Tom';

const aConstList = const ['1', '2', '3'];

// In constant expressions, operands of this operator must be of type 'bool', 'num', 'String' or 'null'
// 在常量表达式中,该运算符的操作数必须为'bool'、'num'、'String'或'null'。
const validConstString = '$outSideName $outSideName2 $aConstList';

// Const variables must be initialized with a constant value
// const常量必须用conat类型的值初始化
const validConstString = '$outSideName $outSideName2 $outSideFinalName';

var outSideVarName='Cathy';
// Const variables must be initialized with a constant value.
// const常量必须用conat类型的值初始化
const validConstString = '$outSideName $outSideName2 $outSideVarName';

// 正确写法
const String outSideConstName = 'Joy';
const validConstString = '$outSideName $outSideName2 $outSideConstName';

数据类型

  • num

    • num是数字类型的父类. 有两个子类int和double。
    • int, DartVM上是[-263,263),编译后的javaScript是[-253,253)
    • double: 64位,双精度浮点数。
  • String

    • Dart里面的String是一系列 UTF-16 代码单元。
    • 您可以使用单引号或双引号来创建一个字符串。
    • 单引号或者双引号里面嵌套使用引号。
    • 用 或{} 来计算字符串中变量的值,需要注意的是如果是表达式需要${表达式}
  • bool

    • Dart 是强 bool 类型检查,只有bool 类型的值是true 才被认为是true。
    • 只有两个对象具有bool类型:true和false,它们都是编译时常量。
    • Dart的类型安全意味着您不能使用 if(nonbooleanValue) 或 assert(nonbooleanValue)等代码, 相反Dart使用的是显式的检查值。
    • assert 是语言内置的断言函数,仅在检查模式下有效
    • 在开发过程中, 除非条件为真,否则会引发异常。(断言失败则程序立刻终止)
  • List集合

在Dart中,数组是List对象

// 创建list
List list = [10, 7, 23];
var fruits = new List();

  • 可以直接打印list包括list的元素

  • list里面的元素必须保持类型一致,不一致就会报错

  • Map集合

// 方式一
Map companys = {'Alibaba': '阿里巴巴', 'Tencent': '腾讯', 'baidu': '百度'};

// 方式二
Map schoolsMap = new Map();
schoolsMap['first'] = '清华';
schoolsMap['second'] = '北大';
schoolsMap['third'] = '复旦';

注意:

  • map的key类型允许不一致

运算符

描述表示
一元后置操作符expr++ ,expr--  ,()  , []  ,.   ,?.
一元前置操作符expr !expr ~expr ++expr --expr
乘除*,  /, % , ~/
加减+ ,-
位移<< , >>
按位与&
按位或|
按位异或^
逻辑与&&
逻辑或||
关系和类型判断>= , > , <= , <  ,as  ,is,is!
等于,不等于==,!=
如果为空??
条件表达式expr1 ? expr2 : expr3
赋值=, *=, = ,~/=, %=, +=, -=, <<=, >>=, &=, ^=, =, ??=
级联..

流程控制语句

  • if ... else
  • for
  • while do...while
  • break ,continue
  • switch...case
  • assert

异常

  • throw

  • 抛出特定类型的异常 throw new FormatException('xxxx')

  • 抛出任意类型的异常 throw 'xxxx'

  • 因为抛出异常属于表达式,可以将throw语句放在=>语句中,或者其它可以出现表达式的地方 distanceTo(Point other) => throw new UnimplementedError();

  • try...catch

    • 将可能出现异常的代码放置到try语句中,可以通过 on语句来指定需要捕获的异常类型,使用catch来处理异常。

      try {
      breedMoreLlamas();
      } on OutOfLlamasException {
      // A specific exception
      buyMoreLlamas();
      } on Exception catch (e) {
      // Anything else that is an exception
      print('Unknown exception: $e');
      } catch (e, s) {
      print('Exception details:\n $e');
      print('Stack trace:\n $s');
      }

  • rethrow 语句用来处理一个异常,同时希望这个异常能够被其它调用的部分使用。

 final foo = '';

void misbehave() {
try {
foo = "1";
} catch (e) {
print('2');
rethrow;// 如果不重新抛出异常,main函数中的catch语句执行不到
}
}

void main() {
try {
misbehave();
} catch (e) {
print('3');
}
}

  • finally
 final foo = '';

void misbehave() {
try {
foo = "1";
} catch (e) {
print('2');
}
}

void main() {
try {
misbehave();
} catch (e) {
print('3');
} finally {
print('4'); // 即使没有rethrow最终都会执行到
}
}

函数 function

  • main函数(和C一样) 每个程序都有自己的main函数,它可以作为程序的入口,返回值为void,可以接收list的参数

  • 级联符号.. 允许您在同一个对象上进行一系列操作。除了函数调用之外,还可以访问同一对象上的字段。这通常会为您节省创建临时变量的步骤,并允许您编写更流畅的代码。

    querySelector('#confirm') // Get an object.
    ..text = 'Confirm' // Use its members.
    ..classes.add('important')
    ..onClick.listen((e) => window.alert('Confirmed!'));

    // 相当于

    var button = querySelector('#confirm');
    button.text = 'Confirm';
    button.classes.add('important');
    button.onClick.listen((e) => window.alert('Confirmed!'));

级联符号也可以嵌套使用,但是当返回值是void时不能构建级联

final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();

  • 可选参数(python) 可选的命名参数, 定义函数时,使用{param1, param2, …},用于指定命名参数。可选的位置参数,用[]它们标记为可选的位置参数
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}

  • 默认参数,函数可以使用=为命名参数和位置参数定义默认值。默认值必须是编译时常量。如果没有提供默认值,则默认值为null。(python)

  • 作为一个类对象的功能 您可以将一个函数作为参数传递给另一个函数.您也可以将一个函数分配给一个变量

void printElement(int element) {
print(element);
}

var list = [1, 2, 3];

// 把 printElement函数作为一个参数传递进来
list.forEach(printElement);

var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');

  • 匿名函数

大多数函数都能被命名为匿名函数,如 main() 或 printElement()。您还可以创建一个名为匿名函数的无名函数,有时也可以创建lambda或闭包。您可以为变量分配一个匿名函数,例如,您可以从集合中添加或删除它。一个匿名函数看起来类似于一个命名函数 - 0或更多的参数,在括号之间用逗号和可选类型标注分隔。下面的代码块包含函数的主体:


var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});

如果函数只包含一条语句,可以使用箭头符号=>来缩短它, 比如上面的例2可以简写成:

 list.forEach((item) => print('${list.indexOf(item)}: $item'));

  • 返回值

所有函数都返回一个值,如果没有指定返回值,则语句return null,隐式地附加到函数体。

  foo() {}
assert(foo() == null);

本篇文章就到这里啦~如果觉得不错的话,就转发出去,让更多人的看到,最后,关注一下,点个在看吧。


文章转载自方家小白,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论