https://www.bilibili.com/video/av52490605?p=17 //教学视频
一个基础Dart程序
printNumber(num aNumber){
print('The number is $aNumber');
}
//主入口
main() {
var number = 42;
printNumber(number);
}
未初始化的变量具有null的初始值.
内置类型
数字 number; 字符串 strings; 布尔 booleans; 列表 lists; 图 maps 符号 symbols
字符串转数字 int.parse('1') double.parse('1.1')
数字转字符串 1.toString() 3.14159.toStringAsFixed(2)//保留两位小数点,四舍五入
'$variable' //输出变量 variable的值
函数
仅含一个表达式的方法,可以简写成
void printNumber(num number) =>
print('The number is $number.');
可选参数可以是可选位置参数或者可选命名参数,但不能既是可选位置参数又是可选命名参数。
/// 把 bold 和 hidden 作为参数的值,并将默认值设为 false.
enableFlags({bool bold: false, bool hidden: false}) {
// 可选命名参数
}
// bold 将会是 true, hidden 则是false
enableFlags(bold:true);
把一组函数的参数放在[]之内可以把它们标记为可选位置参数
Sring say(String from, String msg, [String device]) {
var result = '$from says #msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
assert(say('Bob', 'Howdy', 'smoke signal') == 'Bob says Howdy with a smoke signal');
可选位置参数使用=来声明默认值:
if (emp is Person) { // Type check
emp.firstName = 'Bob';
}
(emp as Person).firstName = 'Bob';
异常处理
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 一个具体异常
buyMoreLlamas();
} on Exception catch (e) {
// 任意一个异常
print('Unknown exception: $e');
} catch (e) {
// 非具体类型
print('Something really unknown: $e');
}
类
创建一个对象,你可以使用 new 关键词并在其后跟上一个构造函数。
var jsonData = JSON.decode('{"x":1, "y":2}');
//用 Point() 创建一个点。
var p1 = new Point(2, 2);
// 用 Point().fromJson() 创建一个点。
var p2 = new Point.fromJson(jsonData);
如果父类没有构造函数,则必须手动调用父类的构造函数中的一个。在冒号(:)之后、构造函数之前指定父类的构造函数
class Person {
Person.fromJson(Map data) {
print('in Person');
}
}
class Employee extends Person {
// Person 没有默认构造函数;
// 你必须调用 super.fromJson(data).
Employee.fromJson(Map data) : super.fromJson(data) {
print('in Employee');
}
}
main() {
var emp = new Employee.fromJson({});
// Prints:
// in Person
// in Employee
}
当实现一个使用 factory 关键词修饰的构造函数时,这个构造函数不必创建类的新实例。
setters 和 Getters
class Rectangle {
num left;
num top;
num width;
num height;
Rectangle(this.left, this.top, this.width, this.height);
// 定义两个计算属性: right and bottom.
num get right => left + width;
set right(num value) => left = value - width;
num get bottom => top + height;
set bottom(num value) => top = value - height;
}
main() {
var rect = new Rectangle(3, 4, 20, 15);
assert(rect.left == 3);
rect.right = 12;
assert(rect.left == -8);
}
创建一个编译时常量的列表,请在列表文字之前添加const
var constantList = const [1, 2, 3]; // constantList[1] = 1; // Uncommenting this causes an error.
使用扩展运算符(...)将列表的所有元素插入另一个列表
var list = [1,2,3];
var list2 = [0,...list];
assert(list2.length == 4);
扩展运算符右侧的表达式可能为null,则可以通过使用支持null的扩展运算符(...?)来避免异常
var list; var list2 = [0, ...?list]; assert(list2.length == 1);
var nav = [ 'Home', 'Furniture', 'Plants', if (promoActive) 'Outlet' ];
var listOfInts = [1, 2, 3];
var listOfStrings = [ '#0', for (var i in listOfInts) '#$i' ];
assert(listOfStrings[1] == '#1');
map初始化 var names = {}; Map()
set初始化 var names = <String>{}; 或 Set<String>names = {};
级联(..)运算符可用于通过对象发出一系列调用
class Student {
void test_method() { print("This is a test method"); }
void test_method1() { print("This is a test method1"); } }
void main() {
new Student()
..test_method()
..test_method1();
}
Dart包
https://pub.dev/packages
https://pub.flutter-io.cn/packages
https://pub.dartlang.org/flutter/
每个Dart应用程序都有一个pubspec.yaml文件,其中包含对其他库的应用程序依赖性以及应用程序的元数据,如应用程序名称,作者,版本和描述。
pub get 获取应用程序所依赖的所有包
pub upgrade 将所有依赖升级到最新版本
pub build 用于构建web应用程序,将创建一个构建文件夹,其中包含所有相关脚本
pub help
Dart Typedef
typedef manyOperation(int firstNo, int secondNo); //
add (int firstNo, int second){ print("add result is ${firstNo + second}") }
subtract(int firstNO, int second){ print("subtract result is ${firstNo - second}") }
divide (int firstNo, int second){ print("divide result is ${firstNo / second}") }
calculator(int a, int b, manyOperation oper){
print("Inside calculator");
oper(a, b);
}
main(){ calculator(5,5,add);calculator(5,5,subtract);calculator(5,5,divide);
自定义库
如自定义一个calculator.dart库
library calculator_lib;
import 'dart:math';
//import statement after the libaray statement
int add(int firstNumber,int secondNumber){ print("inside add method of Calculator Library ") ; return firstNumber+secondNumber; }
int modulus(int firstNumber,int secondNumber){ print("inside modulus method of Calculator Library ") ; returnfirstNumber%secondNumber; }
int random(int no){ return new Random().nextInt(no); }
import 'calculator.dart';
void main() {
var num1 = 10; var num2 = 20; var sum = add(num1,num2); var mod =modulus(num1,num2); var r = random(10);
print("$num1 + $num2 = $sum");
print("$num1 % $num2= $mod");
print("random no $r");
}
如果导入两个具有冲突标识符的库,则可以为一个或两个库指定前缀。使用as关键字指定前缀。
import 'library_uri' as prefix
//原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/dart/dart_programming_data_types.html
List myList = [1,2,3,5,6,7];
var newList = myList.where((value){
return value > 5;
})
print(newList.toList()); //返回数字中值大5的值
myList.any((value){ return value > 5}) ; //只要集合中有大于5,返回ture every方法为全部满足条件返回true
Web(String name, num age, String sex) : super(name, age){}; //冒号后面的将属性传递到父类属性
一个类可以实现多个接口,如下
abstract class A{ printA(); }
abstract class B{ printB(); }
class C implements A,B {
@override
printA(){}
@override
printB() {}
}
mixins可以实现类似多继承方法
class C with A,B{} //c中包括 A,B中所有方法与属性。 A,B中不能有构造函数,也不能继承其他类. 如A,B中有同样的方法,B方法把A方法替换
异步方法举例
import 'dart:io';
import 'dart:convert';
void main() async{
var result = await getDataFormZhihuApi(); //同步
print(result);
}
getDataFormZhihuApi() async{
//创建http对象
var httpClient = HttpClient();
//创建uri对象
var uri = 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();
}
//假如 Person1/Person2文件中都存在Person类,为了避免类名冲突,可以通过as关键字重命名类名,使用时用重命名后的字符串替代原类名
import 'lib/Person1.dart';
import 'lib/Person2.dart' as lib;
import 'lib/Person2.dart' show xxmethod; //只引用文件中xxmethod方法
import 'lib/Person2.dart' hide xxmethod; //引用文件中除xxmethod方法外其他