本篇介绍Dart的函数,类,抽象类,接口,泛型及库的使用
命名函数,匿名函数,箭头函数 注意!!箭头函数只能写一个语句
1 2 3 4 5 6 7 8 9 10 void func () { print ('hello world' ); }; () { print (123 ); }; func2 () => print (123 );
函数的定义及调用 1 2 3 4 5 6 7 8 9 10 11 12 int sunNum(int n){ var sum = 0 ; for (var i =1 ; i<=n; i++) { sum+=i; } return sum; } void main() { print (sumNum(10 )); }
可选参数, 默认参数,命名参数
1 2 3 4 5 6 7 8 9 yyy (String username, {age, String gender='male' , job='programmer' }) { if (age == null || job == null ) return '$username , 年龄保密, $gender ' ; return '$username , 年龄保密, $gender , $job ' ; } void main () { print (yyy('张三' , age:23 , gender: 'female' )); }
把函数作为参数传参 1 2 3 4 5 6 7 8 fn1() => print ('fn1' ); fn2(fn){ fn(); } void main() { fn2(fn1); }
类和构造函数
dart为单继承语言
类里的同名方法为构造函数,在构造函数生成之前还能执行其他的操作,写在括号和左花括号之间,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class PersonY { String name; int age; PersonY(String name, int age): name='构造函数之前生成的name' , age=999 { print ('构造函数生成之前打印的内容:${this .name} --${this .age} ' ); this .name=name; this .age=age; } } main() { PersonY p2 = new PersonY('李四' , 45 ); print (p2.name); }
构造函数可以简写
dart构造函数只有一个,但命名构造函数可以写多个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class PersonZ { String name; int age; PersonZ(this .name, this .age); PersonZ.named(this .name, this .age) { print ('这是命名构造函数' ); } } main() { PersonZ pp = new PersonZ.named('xxxx' , 12 ); print (pp.name); print (pp.age); }
以上执行输出如下:
这是命名构造函数 xxxx 12
私有属性 dart里并没有 public
private
protected
等关键字,定义私有属性时,必须:
以 _
为开头的属性
独立为一个文件,并且 import
到 main
方法里执行,才能达到私有属性的效果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Pet { String _name; int age; Pet(this ._name, this .age); void printInfo() { print ('${this ._name} ====${this .age} ' ); } void _run(){ print ('私有方法' ); } execRun(){ this ._run(); } }
调用处:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import './08-私有属性/Pet.dart' ;void main() { Pet a = new Pet('狗' , 3 ); print (a.age); a.printInfo(); a.execRun(); }
连缀操作符 1 2 3 4 5 6 7 8 9 Person p2 = new Person('王五' , 34 ); p1..name = '李四' ..age = 30 ..printInfo();
继承 可利用 vs code 里的快捷方式进行操作,不用自己写:
super
关键字1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 class Person { String name; num age; Person(this .name, this .age); void printInfo() { print ('父类的printInfo:${this .name} ---${this .age} ' ); } } class Web extends Person { String gender='m' ; Web(String name, num age, String gender) : super (name, age) { this .gender = gender; } run(){ super .printInfo(); print ('${this .name} --${this .age} --${this .gender} ' ); } @override void printInfo() { print ('子类重写的方法:${this .gender} -${this .name} ' ); } }
abstract
抽象类
抽象类:
1 2 3 4 5 6 7 8 9 10 abstract class Pet { eat(); run(); printInfo(){ print ('抽象类的普通方法' ); } }
抽象方法被继承时均要重写:
1 2 3 4 5 6 7 8 9 10 11 12 13 class Dog extends Pet { @override eat() { print ('小狗吃骨头' ); } @override run() { print ('小狗在跑' ); } }
implements
接口
dart里没有接口的概念,用抽象类替代
接口继承时,用关键字 implements
下面的例子举连接数据库的抽象类和实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 abstract class Db { String uri='' ; add(String data); save(); delete(); } class Mysql implements Db { @override String uri; Mysql(this .uri); @override add(String data) { print ('这是mysql的add方法:${data} ' ); } @override delete() { return null ; } @override save() { return null ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 abstract class A { printA(); }abstract class B { printB(); }class C implements A , B { @override printA() { return null ; } @override printB() { return null ; } }
mixins
混合
dart 特有的特性,因为dart是单继承,mixins
可让其实现实现类似多继承的特性,一个类可 mixins
多个类
实现该特性用 with
关键字
被 mixins
的父类不能有构造函数,如有构造函数,不能被 mixins
1 2 3 4 5 6 7 8 9 10 11 class D { printD(){ print ('D' ); }}class E { printE(){ print ('E' ); }}class F with D , E {} main() { F f = new F(); f.printD(); f.printE(); }
有构造函数被 mixins
的方法:extends
后再 with
, 如下例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Person { String name; int age; Person(this .name, this .age); void printInfo(){ print ('${this .name} -${this .age} ' );} } class G { void printG(){print ('G' );} }class P extends Person with G { P(String name, int age) : super (name, age); } main() { P p = new P('呵呵' ,37 ); p.printInfo(); p.printG(); }
泛型 泛型即定义传入和返回类型的校验的一种规范
1 2 3 4 5 6 7 8 9 10 T getData <T> (T value){ print (value); } main() { print (getData <String > ('你好' )); print (getData <int > (123 )); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class PrintClass <T > { List list = <T>[]; void add(T value) { this .list.add(value); } void printInfo() { for (var i=0 ; i<this .list.length; i++) { print (this .list[i]); } } } main() { PrintClass p = new PrintClass <String > (); p.add('xxxxxxx' ); p.printInfo(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 abstract class Cache <T > { getByKey(String key); void setByKey(String key, T value); } class FileCache <T > implements Cache <T > { @override getByKey(String key) { return null ; } @override void setByKey(String key, T value) { print ('我是文件缓存, 把key=${key} value=${value} 的数据写入内存中' ); } } main() { MemoryCache m = new MemoryCache <String > (); m.setByKey('index' , '123' ); }
库的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import 'dart:io' ;import 'dart:convert' ;_getDataFromZhihu() async { var httpClient = new HttpClient(); 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(' ' ); } main(List <String > args) async { var result = await _getDataFromZhihu(); print (result); }
引入,在根目录下写下一个pubspec.yaml
文件,类似 package.json
写下你需要安装的库的版本,如下,可以在这里 拷贝其版本号
1 2 3 4 5 6 name: xxx description: A new flutter module. environment: sdk: '>=2.10.0 <3.0.0' dependencies: http: ^0.13.3
执行安装
方法一,在pubspec.yaml
文件写好 dependencies
,再执行如下:
方法二,直接执行以下命令,安装最新版本
1 dart pub add http_parser
使用
pub 库是以 package
开头:
1 import 'package:http/http.dart' as http;