dart基本语法

基本数据类型

  • 数值类型
  int a = 123
  double b = 123
  • 字符串类型
  // 不可换行
  String a = '23'
  String b = "123"
  // 可换行
  String c = '''123456'''
  String d = """123456"""
  • 布尔类型
  bool a = false
  bool b = true
  • list集合
   // 1.定义List 的方式 - 任意类型
   var a = ["张三",20,true]
  // 2.定义List 的方式 - 指定类型
  var b = <String>["张三","20","true"]
  // 3.定义List 的方式 - 可变
  var b = []
  b.add("1234")
  // 3.定义List 的方式 - 创建固定长度的集合,可修改元素的数据
  var b = List.filled(2,"")
  var b = List<String>.filled(2,"") // list里面必须是对应的类型
  • Maps类型
  void main{
    // 方式1
    var person = {
      "name": "张三",
      "age": 20,
      "work": ["程序员","专家"]
    }
    // 方式2
    var editor = new Map()
    editor["name"] = "张三"
    editor["age"] = "李四"
    editor["work"] = ["程序员","专家"]
    print(person["name"])
    print(editor["name"])
    if( person["name"] is String){
      print(person["name"])
    }
  }
  
  • Runes
  void main(){
    Runes input = new Runes('\u2665','\u{1f60e}')
    print(new String.fromCharCodes(input))
  }
  • Symbols
    Symbos对象表示在Dart程序中声明的运算符或标识符

运算符

  // 算术运算符
  +
  -
  *
  /
  %
  ~ // 取整
  // 关系运算符
  == 
  !=
  >
  <
  >=
  <=
  // 逻辑运算符
  !
  &&
  ||
  // 赋值运算符
  ==
  ??= 
  // 备注:a??=b  a为空则将b赋值给a,否则不赋值
  // 复合运算符
  +=
  -=
  *=
  /=
  %=
  ~=

条件运算符

  if...else
  switch...case
  三元表达式
  ??  // a??10  a为空则将10赋值给a,否则不赋值

类型转换

  Number==>>String 使用toString()
  String ==>> Number int类型:int.parse() 、double类型:double.parse()
  判断变量是否为空 String类型:a.isEmpty Int类型:a == 0

循环

  for
  while
  do...while
  continue
  break

list常用的属性和方法

  // 常用属性
  length
  reversed
  isEmpty
  isNotEmpty
  // 常用方法
  add
  addAll        // 拼接数组
  indexOf
  remove
  removeAt        // 删除 传入索引值
  fillRange(start, end, value)        // 修改 
  insert(index, value)        // 指定位置插入
  insertAll(index,list)        // 指定位置插入List
  toList()                          // 其他类型转换成List
  join()
  split()
  forEach
  map
  where
  any
  every

set的方法

  // 基本用法
  var s = new Set()
  s.add("111")
  // 数组去重
  List myList = [1,2,3,4,5,6,3,2,1]
  s.addAll(myList )
  print(s)         // {1,2,3,4,5,6}
  print(s.toList())        // [1,2,3,4,5,6]

map属性和方法

  // 常用属性:
  keys
  values
  isEmpty
  isNotEmpty
  // 常用方法:
  remove(key)
  addAll({...})
  containsValue        // 查看映射内的值 返回true/false
  forEach
  map
  where
  any                      // 返回true或者false,集合有满足条件返回true,否则返回false
  every                  // 返回true或者false,集合全部满足条件返回true,否则返回false

方法定义

  int printInfo(int x, int y){
    print(x+y)
    return x+y
  }
  // 可选参数,默认参数
  String printInfo(String name,[String sex='男', int age=18]) {
    if(age!=null){
       return "姓名:$name----年龄:$age"
    }else{
      return "姓名:$name----年龄:保密"
    }
  }
// 命名参数
String printInfo(String name,{String sex='男',int age=18}) {
    if(age!=null){
       return "姓名:$name----年龄:$age"
    }else{
      return "姓名:$name----年龄:保密"
    }
  }
  // 方法当作参数传递
  fnOne(){
    print('fn1')
  }
  fnTwo(fn){
    fn()
  }
  var fnAnonymous = (){
    pring('匿名方法')
  }
  void main(){
    var a = 1;
    var b = 2;
    var c = printInfo(a,b);
    var d = printInfo("张三",'男',18);
    var e = printInfo("张三",sex:'男');
    var f = fnAnonymous()
    
    fnTwo(fnOne);
    print(c);
    print(d);
    print(e);
    print(f);
  }

箭头函数

     var a = ["张三",20,true]
     var list = a.map((value) => value*2)
  • 匿名函数
   var fnAnonymous = (){
    pring('匿名方法')
  }
  • 自执行函数
  ((int n){
    pring(n)
  })(2)

闭包

  // 不污染全局,常驻内存
  fn(){
    var a = 123;
    return (){
      a++;
      print(a)
    }
  }
  var b = fn()
  b(); // 124
  b(); //125
  

  class Person{
    String _name, address; // 单独抽离类成一个文件,才没没法使用私有属性,
    static String sex = "男";  // 静态属性使用类名调用或者使用内部方法调用
    int age;
    // 构造函数
    //Person(String _name, int age){
    //  this.name = name;
    //  this.age = age;
    //}
    // 默认构造函数(简写)
    Person(this._name, this.age);
    // 命名构造函数
    Person.other(){ 
      this.address= "衢州"
    }
    // 构造函数给默认值
    otherInfo():age=18{
      print("${this.age}")
    }
    // get
    get inputInfo{
      return this.age;
    }
    // set
    set changeInfo(value){
      this.age = value
    }
    // 静态方法(可以访问静态属性和调用静态方法,没法访问非静态属性,没法调用非静态方法)
    static void showInfo(){
      print("static")
    }
    // 方法
    void getPersonInfo(){
      print("$name------$age")
      print("${this.name}----${this.age}")
      print(sex)  // 调用静态属性
      showInfo() // 调用静态方法
    }
    // 方法
    void setPersonInfo(int age){
      this.age = age;
    }
    // 通过方法调用私有属性
    String getName(){
      return this._name;
    }
    // 私有方法
    String _run(){
      return this._name
    }
    // 通过共有方法调用私有方法
    execRun(){
      this._run();
    }
  }

对象操作符

    ?    //  条件运算发
    as    //  类型转化   (p as Person).getName()
    is     //  类型判断   p is Person
    ..    //  级联操作
    Person p = new Person("小小",18);
    p..name = "小二"
      ..age =20
      ..getName()

类的继承

  class Person{
    String name;
    num age;
    Person(String name, int age);
    void getPersonInfo(){
      print("${this.name}----${this.age}");
    }
    void work(){
      print("无");
    }
   }
  class Programmer extends Person{
    String sex;
    // super既可以给父类构造函数传参也可以给父类命名构造函数传参
    Programmer(String name, num age, String sex):super(name,age){
      this.sex = sex;
    }
    run(){
      print("${this.name}----${this.age}---${this.sex}");
      super.work(); // 子类调用父类的方法
    }
    // 覆写父类的方法
    @override   // 可写可不写,建议写
    void work(){
      print("程序员");
    }
  }

抽象类

  abstract class Animal{
    eat(); // 抽象方法,字类必须实现这个方法;
    info(){ // 普通方法
      print("普通方法")
    }
  }
  class Dog extends Animal{
    @override
    eat(){
      return "bone";
    }
  }

接口

    // 普通类和抽象类都能定义接口,抽象类定义接口可以规范实现他的类,普通类则无法规范。
    // 建议使用抽象类来定义接口,来约束类的对属性和方法的实现
   abstract class Db{
    String url;
    add( String data);
    save( String data);
    delete( String data);
  }
  class MySql implements Db{
    @override
    String uri;
    MySql(this.uri);
    @override
    add(String data){
      print("add");
      print(data);
    }
    @override
    save(String data){
      print("save");
      print(data);
    }
    @override
    delete(String data){
      print("delete");
      print(data);
    }
  }

一个类实现多少接口

  abstract class A{
    String name;
    printA();
  }
  abstract class B{
    printB();
  }
  class C implements A,B{
    @override
    String name;
    @override
    printA(){
      print("A");
    }
    @override
    printA(){
      print("A");
    }
  }

mixins

  // mixins的类只能继承自Object, 不能继承其他类
  // mixins的类不能有构造函数
  // 一个类可以mixins多个mixins类
  class A{
    String name = ;
    printA("A");
  }
  class B{
    printB("B");
  }
  // class C extends D with A,B{}
  class C with A,B{
    
  }
  void main(){
    var c = new C();
    print(c.name)
    c.printA();
    c.printB();
  }

泛型

  • 泛型方法
  // 泛型 泛型方法 泛型类 泛型接口
  // 泛型方法
  T getData<T>(T value){
    return value
  }
  void main(){
    getDate<String> ("你好!")
  }
  • 泛型类
  class Mylist<T>{
    List list = <T>[];
    void add(T value){
      this.list.add(value);
    }
    List getList(){
      return list;
    }
  }
  void main(){
    Mylist mylist = new Mylist<String>();
    mylist.add("小红");
    pirnt(mylist.getList());
  }
  • 泛型接口
  abstract class Cache<T>{
    getByKey(String key);
    void setByKey(String key, T value);
  }

  class FileCache<T> implements Cache<T>{
    @override
    getByKey(String key){
      return key
    }
    @override
    void setByKey(String key, T value){
      print("${key}----${value}")
    }
  }
  class MemoryCache<T> implements Cache<T>{
     @override
    getByKey(String key){
      return key
    }
    @override
    void setByKey(String key, T value){
      print("${key}----${value}")
    }
  }

 void main(){
    MemoryCache memoryCache = new MemoryCache<Map>()
    memoryCache.setByKey("数据", {"name": "小小","age": 18})
  }

  // 自定义的库
  import 'lib/xxx.dart';
  // 系统内置库
  import 'dart:math';
  import 'dart:io';
  import 'dart:convert';
  // Pub包管理系统中的库
  https:// pub.dev/packages
  https:// pub.flutter-io.cn/packages
  https:// pub.dartlang.org/flutter/
  // 库重命名
  import 'package:http/http.dart' as http
  // 库部分引入
  import "lib/xxx.dart" show getInfo(方法名); getInfo能使用,其他的方法不可用;
  import "lib/xxx.dart" hide getInfo(方法名);  getInfo不能使用,其他函数可以使用;
  // 延时加载库
  import "package:deferred/hello.dart" deferred as hello;
  // 库分片
  part 'link.dart'
  //1.需要在自己项目根目录新建一个pubspec.yml
  //2.在pubspec.yaml文件 软后配置名称、描述、依赖信息
  //3.然后运行pub get 获取包下载到本地
  //4.项目中引入库`import 'package:http/http.dart' as http` 文档

async

 import 'dart:io'
 import 'dart:conver';
 void main() async{
   var result = await getDataFromZhihuApi();
   print(result);
 }
 getDataFromZhihuApi() async{
   // 创建HttpClient 对象
   var httpClient = new HttpClient()
   // 创建Uri对象
   var uri = new Uri.http("news-at.zhihu.com",'/api/3/stories/latest');
   // 发起请求,等待请求
   var request await httpClient.getUrl(uri);
   // 关闭请求,等待响应
   var response = await request.close();
   // 解码响应的内容
   return await response.transform(utf8.decoder).join();
 }
 

其他

  // ? 可空类型
  // !类 型断言
  String? getData(data){
    if(data != null){
      return " This is Data!";
    }
    return null
  }
  void printLength(String? str){
    try{
      print(str!.length) // 如果str为空抛出异常,如果不为空则正常打印str的长度。
    }catch(e){
      pinnt("str is null")
    }
  }
  void main(){
    int? a = 123
    a = null
    getData(a)
    printLength(a)
  }
  • late
  class Person{
    late String name;
    late int age;
    void setData(String name, int age){
      this.name = name;
      this.age = age;
    }
  }
  • require
  String printInfo(String userName,{required int age, required String sex}){
    return "姓名: $userName-----性别:$sex----年龄:$age"
  }
  // name可穿可不传
  class Person{
    String? name;
    int age
    Person({this.name,required this.age})
    printInfo(){
      print("$name ----$age")
    }
  }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 重要概念 可以放在变量中的都是对象,所有对象都是类的实例,包括数字,函数,null都是对象, 所有对象都是继承自 ...
    哆啦_阅读 13,139评论 1 14
  • Dart 语言集合了 Java、JavaScript、C、TypeScript 等语言的优势,可以说是集百家之长的...
    风之化身呀阅读 2,597评论 0 2
  • 碎语,有android、iOS、前端、小程序、RN基础,所以,以下记录仅为个人理解记录,没必要的就忽略的 dart...
    DaZenD阅读 2,442评论 0 1
  • 变量 dart是脚本类语言,可以不预先定义变量类型 ,会自动类型推导。定义变量可以通过var关键字来声明变量var...
    yyggzc521阅读 717评论 0 1
  • 1. dart文件以.dart为后缀名 2. 入口方法为main 3. 定义变量,Dart中有类型校验 var s...
    猪猪侠闯天下阅读 1,095评论 0 1