dart基础类型与方法使用
类型及方法
- 字符串、数字、列表、集合、映射,及列表、集合、映射相互转换
void foo() {var toly = Person('xiaoming');toly.say();var bm = toly.bmi(height: 170, weight: 60);print(bm);toly.logNumFunc(-100.5);toly.logStrFunc('你好.abdfd ');toly.logListFun(['1']);toly.logSetFun({'0'});toly.logMapFun({'a': 1});toly.logListToSet();
}class Person {final String name; // 声明语句Person(this.name); // 方法void say() {print('我是' + this.name);// 运行时的类型print(this.name.runtimeType);}double bmi({required double height, required double weight}) {return weight / (height * height);}logNumFunc(double num) {print('abs:' + num.abs().toString());print('ceil:' + num.ceil().toString());print('floor:' + num.floor().toString());print('四舍五入round:' + num.round().toString());print('去除小数取整truncate:' + num.truncate().toString());print('四舍五入,保留几位小数toStringAsFixed:' + num.toStringAsFixed(2).toString());print('double 通过解析数据获得数字:' + double.parse(num.toString()).toString());print('int 通过解析数据获得数字:' + int.parse('10').toString());print('将十进制转为2进制:' + num.ceil().toRadixString(2).toString());}void logStrFunc(String str) {print('字符串模板:${str}');print('字符串索引值获取字符:' + str[1]);print('获取字符串长度:' + str.length.toString());print('字符串截取:' + str.substring(2));print('去掉首位空格trim():' + str.trim());print('去掉左边空格:' + str.trimLeft());print('去掉右边空格:' + str.trimRight());print('字符串小写:' + str.toLowerCase());print('字符串大写:' + str.toUpperCase());print('字符串startsWith:' + str.startsWith('1212').toString());print('字符串endsWith:' + str.endsWith('1212').toString());print('字符串contains:' + str.contains('a').toString());print('字符串replaceAll :' + str.replaceAll('a', '_A'));print('字符串split :' + str.split('').toString());}// 聚合类型:List Map Set 列表 映射 集合logListFun(List<String> list) {list.add('张三');list.addAll(['a', 'b', 'c', 'd']);list.insert(1, '88');list.insertAll(2, ['66', '77']);list.removeAt(0);list.remove('77');print('列表List新增add:|多个新增addAll:|指定位置新增insert:|指定位置多个新增insertAll|删除指定位置的值removeAt:|删除某个元素remove:' +list.toString());list[6] = '00';print('List通过索引直接修改或者访问某个值:' + list[2]);}logSetFun(Set set) {set.add('张三');set.addAll(['a', 'b', 'c', 'd']);set.remove('77');set.removeAll(['a', 'b']);set.add('0'); // 重复新增无效Set set2 = {'a', 'b', 'c', 'd'};print('集合Set没有索引值,新增add/addAll remove/removeAll' + set.toString());print('Set交集intersection:' + set.intersection(set2).toString());print('Set补集difference:' + set.difference(set2).toString());}logMapFun(Map<String, int> map) {print('map通过key值访问,如果不存在就是添加:' + map['b'].toString());map['c'] = 3;map['d'] = 4;print('map通过remove key删除:' + map.remove('c').toString());}logListToSet() {List<String> list = ['a', 'b', 'c', 'd', 'a'];Set<String> set = list.toSet();List<String> list1 = set.toList();List<String> list3 = ['a', 'b', 'c'];Set set1 = {0, 1, 2};Map map = Map.fromIterables(set1, list3);print('通过toSet ,toList方法去重' + list1.toString());print('通过asMap将list转换为map' + list1.asMap().toString());print('Map通过fromIterables可以将set list转为map对象 ' + map.toString());print('Map的keys方法: ' + map.keys.toString());print('Map的values方法: ' + map.values.toString());print('Map的keys方法可以用toSet toList转为Set list: ' +map.values.toList().toString());}
}void main() {foo();
}
自定义异常
int test1(int num) {if (num < 100) {throw Exception("${num} is not a valid number");}return num;
}
class MyException implements Exception {final String args;MyException(this.args);String toString() => '入参${this.args}不能为空';
}void main() {try {test1(1);} on MyException catch (a) {print(a);} catch (e, s) {print('异常对象' + e.toString());print('异常追踪信息' + s.toString());} finally {print('无论是否有异常,都会执行');}print('this is a test');
}
运算符
void calculate({required int number1, required int number2}) {print('或者数字${number1} 和 数字${number2} 的商,用~/:' +(number1 ~/ number2).toString());
}void caseFun(num1, num2, param1) {print('!=两个是否相等:' + (param1 != null).toString());if (num1 > num2) {print('大于');} else if (num1 == num2) {print('等于');} else {print('小于');}
}void evalFun(a) {var b = a ??= 20; // 如果a为null,将20赋值给bprint(b);print(b &= 10);print(b |= 10);
}void main() {calculate(number1: 10, number2: 3);caseFun(1, 2, '');evalFun(null);
}
class类
class Test {double x, y; // 成员变量String? _name;Test(this.x, this.y); // 构造方法,用于对成员变量进行赋值,this.x =x; this.y =y;void add() {//成员方法print(x + y);}// get关键字,使用之后可以不加()double get area => x * y;// 等价于如下double getArea() => x * y;// set关键字,使用之后可以不加()void set name(String? value) {if (value != null) {_name = value;} else {_name = '';}print('name = ${_name}');}
}class Student {Document document;Student(this.document);void event(String string) {document.records.add(string);}String callDocument() {return document.records.join("\n");}void died() {document.records.clear();}
}class Document {List<String> records = [];void addRecord(String string) {records.add(string);}
}void main() {Test t = new Test(1, 2);t.x = 100;t.name = '3232';print(t.x);print(t.area);print(t.area);Document document = new Document();Student xiaoming = new Student(document);xiaoming.event('xiaoming2001年幼儿园');xiaoming.event('xiaoming2004年小学');xiaoming.event('xiaoming2011年初中');String res = xiaoming.callDocument();print(res);
}
抽象类
- 继承
// 此处类 当接口用
class Vec2 {int x;int y;Vec2(this.x, this.y);
}abstract class Shape {Vec2 center;Shape(this.center);void move() {center.x += 10;center.y += 10;}void draw() {String info = '绘制矩形:中心点(${this.center.x},${this.center.y})${drawChildIn()}';print(info);}String drawChildIn();
}class Rectangle extends Shape {double height;double width;Rectangle(Vec2 center, {this.height = 10, this.width = 10}) : super(center);String drawChildIn() {return '高:${this.height},宽:${this.width}';}
}void main() {Rectangle rectangle = Rectangle(Vec2(100, 100));rectangle.draw();rectangle.move();
}
接口实现
必须强制覆写 所有 成员方法
必须 强制覆为 所有 成员变量提供 get 方法
class A {String name;A(this.name);log() {print(this.name);}
}class B {String name;B(this.name);log() {print(this.name);}
}class C implements A, B {// @override// String get name => 'C';// @override// set name(String _name) {// this.name = _name;// }String name;int age;C(this.name, this.age);log() {print('${this.name} is ${this.age} years old');}
}void main() {C c = C('张三', 20);c.log();
}
混入类
定义的抽象方法 要求派生类必须实现 抽象方法
混入类不能拥有【构造方法】
二义性问题时,会 “后来居上"
mixin MoveAble {double speed = 20;void move() {print('===$runtimeType==');}void log();
}
// 两个混入类可以通过on 继承
mixin Position on MoveAble {double x = 0;double y = 0;
}// 因为 Position继承了 MoveAble, 应该先混入MoveAble
class Shap with MoveAble, Position {void log() {print('===log==');}
}void main() {Shap a = new Shap();a.speed = 100;a.move();a.log();print(a is MoveAble);
}