dart语法

 变量声明

1.var 类似于JavaScript中的var,它可以接收任何类型的变量,但最大的不同是Dart中var变量一旦赋值,类型便会确定,则不能再改变其类型,如:
    var t;
    t="hi world";
    // 下面代码在dart中会报错,因为变量t的类型已经确定为String,
    // 类型一旦确定后则不能再更改其类型。
    t=1000;

    上面的代码在JavaScript是没有问题的,前端开发者需要注意一下,之所以有此差异是因为Dart本身是一个强类型语言,任何变量都是有确定类型的,在Dart中,当用var声明一个变量后,Dart在编译时会根据第一次赋值数据的类型来推断其类型,编译结束后其类型就已经被确定,而JavaScript是纯粹的弱类型脚本语言,var只是变量的声明方式而已。
2.dynamic和Object
    Dynamic和Object 与 var功能相似,都会在赋值时自动进行类型推断,不同在于,赋值后可以改变其类型,如:
    dynamic t;
    t="hi world";
    //下面代码没有问题
    t=1000;

    Object 是dart所有对象的根基类,也就是说所有类型都是Object的子类,所以任何类型的数据都可以赋值给Object声明的对象,所以表现效果和dynamic相似。
3.final和const
    如果您从未打算更改一个变量,那么使用 final 或 const,不是var,也不是一个类型。 一个 final 变量只能被设置一次,两者区别在于:const 变量是一个编译时常量,final变量在第一次使用时被初始化。被final或者const修饰的变量,变量类型可以省略,如:
    //可以省略String这个类型声明
    final str = "hi world";
    //final str = "hi world"; 
    const str1 = "hi world";
    //const String str1 = "hi world"

console变为print

Dart语言时,请记住以下事实和概念:

  • 任何保存在变量中的都是一个 对象 , 并且所有的对象都是对应一个 类 的实例。 无论是数字,函数和 null 都是对象。所有对象继承自 Object 类。

  • 尽管 Dart 是强类型的,但是 Dart 可以推断类型,所以类型注释是可选的。 在上面的代码中, number 被推断为 int 类型。 如果要明确说明不需要任何类型, 需要使用特殊类型 dynamic 。

  • Dart 支持泛型,如 List<int> (整数列表)或 List<dynamic>(任何类型的对象列表)。

  • Dart 支持顶级函数(例如 main() ), 同样函数绑定在类或对象上(分别是 静态函数 和 实例函数 )。 以及支持函数内创建函数 ( 嵌套 或 局部函数 ) 。

  • 类似地, Dart 支持顶级 变量 , 同样变量绑定在类或对象上(静态变量和实例变量)。 实例变量有时称为字段或属性。

  • 与 Java 不同,Dart 没有关键字 “public” , “protected” 和 “private” 。 如果标识符以下划线( _)开头,则它相对于库是私有的。 有关更多信息,参考 库和可见性

  • 标识符 以字母或下划线( _)开头,后跟任意字母和数字组合。

  • Dart 语法中包含 表达式( expressions )(有运行时值)和 语句( statements )(没有运行时值)。 例如,条件表达式 condition ? expr1 : expr2 的值可能是 expr1 或 expr2 。 将其与 if-else 语句 相比较,if-else 语句没有值。 一条语句通常包含一个或多个表达式,相反表达式不能直接包含语句。

  • Dart 工具提示两种类型问题:警告_和_错误。 警告只是表明代码可能无法正常工作,但不会阻止程序的执行。 错误可能是编译时错误或者运行时错误。 编译时错误会阻止代码的执行; 运行时错误会导致代码在执行过程中引发 异常

#关键字

Dart 语言关键字列表。

abstract 2 dynamic 2 implements 2 show 1
as 2 else import 2 static 2
assert enum in super
async 1 export 2 interface 2 switch
await 3 extends is sync 1
break external 2 library 2 this
case factory 2 mixin 2 throw
catch false new true
class final null try
const finally on 1 typedef 2
continue for operator 2 var
covariant 2 Function 2 part 2 void
default get 2 rethrow while
deferred 2 hide 1 return with
do if set 2 yield 3

避免使用这些单词作为标识符。 但是,如有必要,标有上标的关键字可以用作标识符:

  • 带有 1 上标的单词为 上下文关键字, 仅在特定位置具有含义。 他们在任何地方都是有效的标识符。

  • 带有 2 上标的单词为 内置标识符, 为了简化将 JavaScript 代码移植到 Dart 的工作, 这些关键字在大多数地方都是有效的标识符, 但它们不能用作类或类型名称,也不能用作 import 前缀。

  • 带有 3 上标的单词是与 Dart 1.0 发布后添加的异步支持相关的更新,作为限制类保留字。 不能在标记为 async ,async 或 sync* 的任何函数体中使用 await 或 yield 作为标识符。

关键字表中的剩余单词都是保留字。 不能将保留字用作标识符。

 Dart 函数也是对象,并且有一个类型Function。这意味着函数可以赋值给变量或作为参数传递给其他函数,这是函数式编程的典型特征。

  1.函数声明

    bool isNoble(int atomicNumberreturn _nobleGases[atomicNumber!= null}

  2.如果没有显式声明返回值类型时会默认当做dynamic

  3.可以使用箭头函数

  4.函数作为变量  var say=(str){ print(str)}

  5.函数作为参数传递 callback回调

  6.可选的命名参数

异步支持 asyncawait关键词支持了异步编程,允许您写出和同步代码很像的异步代码。

Future/Future.then/Future.catchError/Future.whenComplete/Future.wait

Future.then

//Duration延迟2秒执行

Future.delayed(new Duration(seconds: 2),(){ return "hi world!"; }).then((data){ print(data); });

Future.catchError

//异步任务发生错误,在catchError中捕获错误
Future.delayed(new Duration(seconds: 2),(){
   //return "hi world!";
   throw AssertionError("Error");  
}).then((data){
   //执行成功会走到这里  
   print("success");
}).catchError((e){
   //执行失败会走到这里  
   print(e);
});

Future.whenComplete  无论成功或失败都会走到这里

Future.delayed(new Duration(seconds: 2),(){
   //return "hi world!";
   throw AssertionError("Error");
}).then((data){
   //执行成功会走到这里 
   print(data);
}).catchError((e){
   //执行失败会走到这里   
   print(e);
}).whenComplete((){
   //无论成功或失败都会走到这里
});

Future.wait 等待多个异步任务执行结束后才进行的操作,wait[ajax1,ajax2,ajax3]

Async/await JavaScript中的async/await功能和用法是一模一样的

task() async {
   try{
    String id = await login("alice","******");
    String userInfo = await getUserInfo(id);
    await saveUserInfo(userInfo);
    //执行接下来的操作   
   } catch(e){
    //错误处理   
    print(e);   
   }  
} 

  

@Override标签的作用:

@Override是伪代码,表示方法重写。

@Override标签的好处:

1.作为注释,帮助自己检查是否正确的复写了父类中已有的方法

2.便于别人理解代码

3.编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错.

例如:在重写父类的service时,在方法前面加上@Override 系统可以帮你检查方法的正确性。

1
2
3
4
5
6
7
public class AdminServlet extends HttpServlet{
    @Override  //表示方法重写
    protected void service(HttpServletRequest req,HttpServletResponse resp)
    throws ServletException,IOException{
        req.setCharacterEncoding("utf-8");
    }
}

如果将方法错误写为Service

原文地址:https://www.cnblogs.com/chenzxl/p/13508907.html