Dart入门

原创
2019/12/18 19:52
阅读数 62

要学Flutter必先学Dart,Dart和Java的语法很像,学过Java的人很快就能入手

Dart下载地址https://dart.dev/get-dart

VSCode下载地址https://code.visualstudio.com/

VSCode装好以后,安装插件Chinese汉化插件、Dart插件、code runner插件

1.基础

main(){  print('你好 dart');}

var会自动推断变量类型,赋值类型不一致会报错

常量用const或final定义,final是懒加载的,编译时不赋值,运行时才赋值

* 三个单引号或三个双引号允许字符串内部换行,一个单引号和双引号都不行

void main(){  String str = '''    这是第一行    这是第二行    这是第三行  ''';  print(str);}

* 字符串的拼接

void main(){  String str1 = "你好";  String str2 = 'Dart';  print(str1+str2);  print("$str1$str2");}

数值只有int和double两个类型

* map字典类型

void main(){  var person={    "name":"张三",    "age":20  };  print(person["name"]);}

* 判断变量类型

void main(){  var str = '1234';  if(str is String){    print('str是String类型');  }}

* 非空不赋值

void main(){  int b;  //如果b为空,才赋值  b??=3;  print(b);    b??=6;  print(b); }
void main(){  var a;  var b=a??10;  print(b);}打印10

* 类型转换

void main(){  String str = '111';  var myNum = int.parse(str);  print(myNum is int);}void main(){  List myList =['香蕉','苹果','西瓜'];  myList.fillRange(1,2,'梨子');  print(myList);}
输出[香蕉, 梨子, 西瓜]

* 数组转字符串

void main(){  List myList =['香蕉','苹果','西瓜'];  var str = myList.join('-');  print(str);}
输出香蕉-苹果-西瓜

* 条件判断

any只要有一个值符合条件就返回true,every必须所有值都符合条件才返回true

void main(){  List myList =[1,3,4,6,7,9,10];  var newList = myList.where((value){    return value>5;  });  print(newList.toList());}输出[6, 7, 9, 10]void main(){  List myList =[1,3,4,6,7,9,10];  var newList = myList.any((value){    return value>5;  });  print(newList);}输出truevoid main(){  List myList =[1,3,4,6,7,9,10];  var newList = myList.every((value){    return value>5;  });  print(newList);}输出false

* 迭代

void main(){  var s=new Set();  s.addAll([1,22,333]);  s.forEach((value)=>print(value));}输出122333

* 可选参数,默认参数

void main(){  print(printUserInfo("张三"));}
String printUserInfo(String username,[String sex='男',int age]){ if(age!=null){ return "姓名:$username--年龄:$age--性别:$sex"; } return "姓名:$username--年龄保密--性别:$sex";}输出 姓名:张三--年龄保密--性别:男

* 把方法当做参数来传递

fn1(){  print('fn1');}
fn2(a){ a();}
main(){ fn2(fn1);}输出 fn1

* 箭头函数

main(){  List list=['苹果','香蕉','西瓜'];  list.forEach((value)=>print(value));  list.forEach((value)=>{    print(value)  });}

* 匿名函数

main(){  var printNum=(){    print(123);  };  printNum();}

* 自执行方法

  ((n){    print('我是自执行方法 $n');  })(12);

全局变量会常驻内存,污染全局;局部变量不常驻内存,会被垃圾机制回收,不污染全局

* 闭包能够常驻内存,且不污染全局

main(){  fn(){    var a =123;    return(){      a++;      print(a);    };  }
var b = fn(); b(); b(); b();}
输出:124125126

* 命名构造函数

class Person{  String name;  int age;  //默认构造函数的简写  Person(this.name,this.age);  //命令构造函数  Person.now(){    print('我是命名构造函数');  }  //命令构造函数  Person.setInfo(String name,int age){    this.name = name;    this.age = age;  }  void printInfo(){    print("${this.name}---${this.age}");  }}main(){  Person p1 = new Person('张三',20);  p1.printInfo();
Person p2 = new Person.setInfo('李四',30); p2.printInfo();}

变量前面加下划线_,就申明为私有变量了;方法前面加下划线_,就申明为私有方法了

* 通过访问属性的方式访问方法

class Rect{  num height;  num width;  Rect(this.height,this.width);  get area{    return this.height*this.width;  }  set areaHeight(value){    this.height = value;  }}main(){  Rect r = new Rect(10, 4);  r.areaHeight = 6;  print("面积:${r.area}");}

初始化属性

class Rect{  num height;  num width;  Rect():height=2,width=10{
} get area{ return this.height*this.width; } set areaHeight(value){ this.height = value; }}main(){ Rect r = new Rect(); print("面积:${r.area}");}

 

2.属性

* 继承

class Person{  String name;  num age;  Person(this.name,this.age);  void printInfo(){    print("${this.name}---${this.age}");  }}
class Student extends Person{ String sex; Student(String name,num age,String sex) : super(name,age){ this.sex = sex; } @override void printInfo(){ print("${this.name}---${this.age}---${this.sex}"); //调用父类的方法 super.printInfo(); }}
main(){ var p; //当p为null时不会执行 p?.printInfo(); p = new Person('张三', 20); //强制转换类型 (p as Person).printInfo(); //连缀操作 p..name="李四" ..age=30 ..printInfo(); //子类继承及复写 Student s = new Student('王五', 10,'男'); s.printInfo();}

dart没有interface关键字,可以用abstract关键字

* mixins相当于多继承

class A{  void printA(){    print("A");  }}
class B{ void printB(){ print("B"); }}
class C with A,B{
}
void main(){ var c = new C(); c.printA(); c.printB();}

作为mixins的类不能有构造函数,不能继承其他类,而且如果with顺序不同,相同方法会覆盖

 

3.调库

* 调用内置库

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

调用asyc必须要用await

* 第三方库的地址是https://pub.dev

配置文件pubspec.yaml

name: XXXdescription: A new flutter module projectdependencies:  http: ^0.12.0+2  date_format: ^1.0.6

cmd命令行执行pub get下载库

例子

import 'dart:convert' as convert;//重命名import 'package:http/http.dart' as http;//重命名
main(List<String> arguments) async { // This example uses the Google Books API to search for books about http. // https://developers.google.com/books/docs/overview var url = "https://www.googleapis.com/books/v1/volumes?q={http}";
// Await the http get response, then decode the json-formatted responce. var response = await http.get(url); if (response.statusCode == 200) { var jsonResponse = convert.jsonDecode(response.body); print(jsonResponse); var itemCount = jsonResponse['totalItems']; print("Number of books about http: $itemCount."); } else { print("Request failed with status: ${response.statusCode}."); }}

导库使用as重命名解决冲突的问题,导库后使用show或hide可以限制部分引入

欢迎关注我的微信公众号:安卓圈

本文分享自微信公众号 - 安卓圈(gh_df75572d44e4)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
在线直播报名
返回顶部
顶部