掌握Flutter:Dart语言入门指南

发表时间: 2021-01-12 17:43

Dart是面向对象的、类定义的、单继承的语言。

环境搭建

brew tap dart-lang/dartbrew install dartdart --version

测试

touch test.dartdart test.dart

test.dart

main(List<String> args) {  print("test");}

另:vs code 安装 Dart&Code Runner运行


标识符/关键字

  • 标识符包括字符和数字,但标识符不能以数字开头
  • 除下划线(_)或美元符号($)外,标识符不能包含特殊符号
  • 标识符不能是关键字
  • 标识符区分大小写
  • 标识符不能包含空格

dart区分大小写

dart语句以(;)结尾


数据类型

数字 字符串 布尔 列表(类似于数组) 集合set 映射map 符文 符号


数字类型

整数 双精度数

var a = 0;int b = 1;double c = 0.1;


字符串

${}插入表达式的值 和 $变量

var s1 = 'hello';int n = 2;String str = "the n is ${n+1} $n";


布尔

与Js不同,布尔类型仅将文字true识别为true,其他都视为false(在未检查模式下运行时)

var real = true;bool isReal = false;


列表

var list = [val1, val2, val3];// 或var list = new List();List list = [val1, val2, val3];


集合

var names = {'xiaoming', 'lilei'};// 或var names = <String>{};Set<String> names = {};


枚举类型

enums , 是一种特殊的类,用于表示数量固定的常量值

enum Color { red, green, blue };


映射

var gifts = {  'first': 'partridge',  'second': 'turtledoves'}// 或var gifts = Map();gifts['first'] = 'partridge';


变量

var后就不要写类型 ,写了类型不要var ,两者都写会报错


final & const

final和const关键字都是用于声明常量

运算符

// 通用操作int a = 1;++a;a++;var b = 1;print(a == b);  // falseprint(a * b); // 3bool real = false;real ? print('real') : print('not real'); // not realprint(real && a == b); // falseprint(real || a == 3); // trueprint(a != 2); // trueprint(a <= b); // falsevar c = 9;c += 10;print("c = $c"); // c = 19print(1<<2); // 4// 注意特别操作// ~/ 取整除法 / 除法运算int k = 1;int j = 2;print(k / j); // 0.5print(k ~/ j); // 0// is is! 判断一个变量是不是某个类型var s = "hello";print(s is String); // truevar num = 6;print(num is! String); // true// as强制转换为特定类型(emp as Person).firstName = 'Bob';// ??= 运算符前面为null则赋值var param1 = "hello", param2 = null;param1 ??= "world";param2 ??= "world";print("param1 = $param1"); // param1 = helloprint("param2 = $param2"); // param2 = world// ??  若前面为null则返回后值String playerName(String name) => name ?? 'Guest';// ?. 有值则返回,无值则返回nullvar str1 = "hello world";var str2 = null;print(str1?.length); // 11print(str2?.length); // null print(str2.length); // 报错


执行语句

顺序 条件 循环

if / else switch for / while

for...in 用于循环对象的属性

try / catch 可用on捕获指定类型的错误

try {  breedMoreLlamas();} on OutOfLlamasException {  // 一个特殊的异常  buyMoreLlamas();} on Exception catch (e) {  // 其他任何异常  print('Unknown exception: $e');} catch (e) {  // 没有指定的类型,处理所有异常  print('Something really unknown: $e');}


函数

可选参数

箭头函数

printMsg() => print("hello");


匿名函数

test(Function callback) {  callback("hello");}main() {  test((param) {    // 打印 hello    print(param);  });}


没有public protected private

如果变量或函数以下划线(_)开始,函数或变量属于包私有(private)的方法


接口

dart没有声明接口的语法,类声明本身就是dart中的接口

class Person {  void printMsg() {    print('Person');  }}class Teacher implements Person {  void printMsg() {    print('Teacher');  }}

可支持多个接口,用逗号隔开

class Teacher implements Person1, Person2...


在 Dart 2 中 new 关键字变成了可选的

构造函数 & this

class Person {  String name;  Person(String name) {    this.name = name;    print('this name is: $name');  }}// 或class Person {  String name;  Person(this.name) {    print('this name is: $name');  }}


setter & getter

关键字set get


extends

dart单层多级继承,最多从一个父类继承

class Person {  void printMsg() {    print('printMsg test');  }}class Child extends Person {}


方法重写

class Person {  void printMsg() {    print('printMsg test');  }}class Child extends Person {  @override  void printMsg() {    print('printMsg override');  }}


static

// 调用Person.age = 18;Person.printMsg();class Person {  static int age;  static printMsg() {    print('printMsg ${Person.age}');  }}


super

super关键字用于引用类的直接父级

class Person {  String msg = 'test';  void printMsg(int a) {    print('parent a $a');  }}class Child extends Person {  @override  void printMsg(int b) {    print('child b $b');    super.printMsg(10);    print('${super.msg}');  }}


抽象类和抽象方法

使用abstract修饰一个类,则这个类是抽象类,抽象类中可以有抽象方法和非抽象方法,抽象方法没有方法体,需要子类去实现

abstract class Doer {  // 抽象方法,没有方法体,需要子类去实现  void doSomething();  // 普通的方法  void greet() {    print("hello world!");  }}class EffectiveDoer extends Doer {  // 实现了父类的抽象方法  void doSomething() {    print("I'm doing something...");  }}


对象

(..)级联运算符

new Person()..printMsg()..printMsg1();

toString()

返回对象字符串表达形式


Mixin

mixins是一个重复使用类中代码的方式

如果 Mixin 不希望作为常规类被使用,使用关键字 mixin 替换 class

如: mixin A

class A {  a() {    print("A's a()");  }}class B {  b() {    print("B's b()");  }}// 使用with关键字,表示类C是由类A和类B混合而构成class C = A with B;main() {  C c = new C();  c.a(); // A's a()  c.b(); // B's b()}


泛型(略)

Dart库

pub getpub update

引入

import 'dart:html';import './util.dart';import 'package:lib2/lib2.dart' as lib2;import 'package:greetings/hello.dart' deferred as hello; // 懒加载

网络请求

import 'package:rubbish_guard/utils/net_utils.dart';import 'package:rubbish_guard/api/api.dart';// 获取当前用户信息static Future getUserInfo(context, Map<String, dynamic> params) async {  var response = await NetUtils.request(context, Api.GET_USER_INFO, params);  try {    return response['data']['userInfo'];  } catch (err) {    return null;  }}

关注公众号: 页面小杨 【实战干货、原创分享】