Dart 基础训练

环境安装

Dart 环境

brew tap dart-lang/dar
brew install dart

开发工具

VS Code + Flutter 插件 + Dash

基础语法

变量

dart 变量是类型推断的,类似 Swift:

var hi = 'Hello World!'; // String
var age = 18; // int
var isMan = tInt; // bool

变量也可以指定类型,但如果指定后则不可以修改类型, var 则可以动态变更:

String hi = 'Hello World!';
int age = 18;
bool isMan = true;

变量属性 var 、final 、const:

var hi = 'Hello World!';  // 可变
final age = 18;   // 赋值后不可变
const isMan = true;  // 编译期间赋值,并不可变

类型

dart 支持以下类型:

  • numbers (int, double)
  • strings (String)
  • booleans (bool)
  • lists (List)
  • sets (Set)
  • maps (Map)
  • runes (UTF-32 字符串)
  • enum (集合)

操作符

参考 Swift、C,几乎都一样。

函数

类似 C 语言的函数定义:

int addition(int a, int b) {
  return a + b;
}
addition(1, 3); // 4

dart 的函数可以动态推荐返回类型,同时也可以写成:

addition(int a, int b) {
  return a + b;
}

dart 函数指定参数名称:

addition({int a, int b}) {
  return a + b;
}
print(addition(a: 1, b: 3));

只有一行实现代码时可以使用箭头函数:

addition({int a, int b}) => a + b;
print(addition(a: 1, b: 3));

匿名函数:

var sayHi = () => print("Hi Dart!");
sayHi();
var sayHello = ({String name}) => print("Hello," + name);
sayHello(name: "Dart");

分支 & 循环

if else if else…..

final num = 89;
if (num >= 85) {
  print('优秀');
} else {
  print("一样优秀");
}

switch case

switch (num) {
  case 84:
    print(0);
    break;
  case 85:
  case 86:
    print(100);
    break;
  default:
    print(0);
}

三目运算:

var a = 100;
var b = 200;
a < b ? a = b : b = a;

for 循环:

for (var i = 0; i < 100; i++) {
  print(i);
}
for (var item in [1, 2, 3, 4, 5]) {
  print(item);
}

while:

var num = 1;
while (num < 100) {
  num++;
}
do {
  num++;
} while (num < 200);

创建类,参考 C++:

class UserInfo {
  int age;
  String name;
  UserInfo(int age, String name) {
    this.age = age;
    this.name = name;
  }
}

main(List<String> args) {
  final user = UserInfo(18, "帅气");
  print(user.name);
}

更友好的构造方法:

class UserInfo {
  int age;
  String name;
  // UserInfo(int age, String name) {
  //   this.age = age;
  //   this.name = name;
  // }

  // equal to 
  UserInfo(this.age, this.name);
}

默认构造函数:

class UserInfo {
  int age;
  String name;
  
  UserInfo({int age = 18, String name = "人穷样衰"}) {
    this.age = age;
    this.name = name;
  }
}

main(List<String> args) {
  final user = UserInfo();
  print(user.name);
}

命名构造函数:

class UserInfo {
  int age;
  String name;
  String id;
  UserInfo({int age = 18, String name = "人穷样衰"}) {
    this.age = age;
    this.name = name;
  }

  UserInfo.otherInit(int age, String id) {
    this.age = age;
    this.id = id;
  }
}

main(List<String> args) {
  final user = UserInfo.otherInit(18, "120202021020");
  print(user.name); // null
  print(user.id); // 120202021020
}

类的浅拷贝:

final user = UserInfo.otherInit(18, "120202021020");
var u1 = user;
print(u1.age); // 18
user.age = 20;
print(u1.age); // 20

类没有默认的深拷贝行为,但可以给类加一个拷贝方法实现深拷贝功能:

UserInfo copy () => UserInfo(xxx, xxx, xxx)

类属性 & 类方法:

class Person {

  static const canWalk = true;

  static walk(){

  }
}

注意:dart 运行时垃圾回收,不需要手动回收垃圾。

面向对象

派生

从基类派生,通过 extend 关键字实现的:

class Person {
  String name;

  Person(this.name);

  myName() {
    print("My name is " + this.name);
  }
}

class Student extends Person  {
  String sId;

  Student(String name, String sId) : super(name) {
    this.sId =sId;
  }
}

main(List<String> args) {
  var s = Student("Me", "120202021020");
  s.myName();
}

多态

类的函数可以通过 @override 对方法进行重写:

class Person {
  String name;

  Person(this.name);

  myName() {
    print("My name is " + this.name);
  }
}

class Student extends Person  {
  String sId;

  Student(String name, String sId) : super(name) {
    this.sId =sId;
  }

  @override
  myName() {
    print("I'm a student, my name is " + name);
  }
}

main(List<String> args) {
  var s = Student("Me", "120202021020");
  s.myName();
}

抽象类 & 抽象方法

抽象类与抽象方法,相当于 OC、Swift 的 protocol,只是定义一个类和方法,并没有具体的实现。我们可以通过abstract 来实现抽象类:

abstract class RequestAPI {
  String url;
  request();
}

然后通过 implements 来实现抽象类:

class UserInfoRequest implements RequestAPI {
  String url;

  UserInfoRequest(this.url);

  request() {
    print("request user info");
  }
}

main(List<String> args) {
  var request = UserInfoRequest("https://yxxxhao.com/user/userinfo");
  request.request();
}

mixin

不知道该怎么形容,感觉你有点像 Swift 的扩展,实现的代码可以在任意地方使用它:

mixin AlertOperation {
  show(String msg) => print(msg);
  dismiss() => print('dismiss alert view');
}

class UserInfoRequest with AlertOperation implements RequestAPI {
  String url;

  UserInfoRequest(this.url);

  request() {
    show("request user info");
  }
}

异步

dart 中使用到异步操作时, 需要先引入异步操作的核心库:

import 'dart:async';

Future

Future 是什么?如果你对 Promise 有所了解,Future 也是同样的意思,简单点理解:"如果特定的操作完成了,那么执行特定的代码"。

class UserInfoRequest {
  String url;

  UserInfoRequest(this.url);

  Future<List<String>> getFriendList(String uid) {
    return new Future<List<String>>(() {
      // api request
      return [
        'friend1',
        'friend2',
        'friend3'
      ];
    });
  }
}

main(List<String> args) {
  var request = UserInfoRequest("https://yxxxhao.com/userinfo");
  request.getFriendList("1202").then((list) => {
    print(list)
  }).catchError((error) => {
    print(error)
  });
}

Async & Await

我们可能通过 Async & Await 对 Future 代码进一优化,我们可以用 async 来标识 main 方法里面存在异步操作,然后通过 await 来等待异步操作回来,通过 catch 来捕获异常,达到用写同步代码的方式来实现异步操作:

main(List<String> args) async {
  var request = UserInfoRequest("https://yxxxhao.com/userinfo");
  try {
    var list = await request.getFriendList("1202");
    print(list);
  }
  catch (error) {
    print(error);
  }
}

实践

LeetCode 题目练习

  1. 500. 键盘行

    findWords(List<String> words) {
      var list = [];
      var keys = ["qwertyuiop", "asdfghjkl", "zxcvbnm"];
    
      for (String word in words) {
        final array = word.toLowerCase().runes.toList();
        for (var str in keys) {
            var arr = str.runes.toList();
            for (var i = 0; i < array.length; i++) {
              if (!arr.contains(array[i])) {
                break;
              }
              if (i == array.length - 1) {
                list.add(word);
              }
            }
        } 
      }
      return list;
    }
    print(findWords(["Hello", "Alaska", "Dad", "Peace"]));
    
  2. 349. 两个数组的交集

    List<int> intersection(List<int> nums1, List<int> nums2) {
      Set<int> s = {};
      List<int> list = [];
      for (var num in nums1) {
        if (!s.contains(num)) {
          s.add(num);
        }
      }
      for (var num in s) {
        if (nums2.contains(num)) {
          list.add(num);
        }
      }
      return list;
    }
    

网络请求

  1. 请求用户信息

    getUserInfo() async {
      var httpClient = new HttpClient();
      var uri = new Uri.http('yxxxhao.com', '/user/userinfo', {'uid': '120202'});
    
      try {
        var request = await httpClient.getUrl(uri);
        var response = await request.close();
        print(response);
      }
      catch (error) {
        print(error);
      }
    }
    
    main(List<String> args) async {
      getUserInfo();
    }
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容