一、几个基本概念
- dart语言风格和C语言类似,而且dart是面向对象的语言。需要重点关注的是:Dart中所有的变量都是对象。甚至整数、函数(function类)、null也看做是对象。所有的对象都继承于Object类
- Dart是强类型语言(程序中表达的任何对象所从属的类型都必须能在编译时刻确定
)。 Dart可以推断出变量的类型,所以变量的类型指定不一定要标明。如果你想明确表示这个变量不想被任何一个类型指定,那就使用特殊类型dynamic来表示。 - Dart语言支持通用类型,比如List<int>表示整数集列表,List<dynamic>表示元素集为任意类型对象的列表
- Dart支持顶级函数(如main()),以及绑定到类或对象的函数(分别是静态方法和实例方法)。您还可以在函数中创建函数(嵌套函数或本地函数)。
- Dart支持顶级变量,以及绑定到类或对象(静态和实例变量)的变量。实例变量有时称为字段或属性
- 与OC不同的是,dart语言中没有public、protected和private这些关键字。但是在dart里面,以下划线开头的变量自动识别为私有变量
- dart中也有assert函数,但是assert(bool)中不为true时才会崩溃
- 常量的表示除了const修饰之外(编译时常量),还可以用final修饰变量,意思为只能赋值一次的变量
- function是对象,所以可以赋值给变量,也可以当做其他方法的参数(???)
- 所有的函数都返回一个值。如果没有指定返回值,则 默认把语句 return null; 作为函数的最后一个语句执行。
二、基础数据类型
num和string相互转换
// String -> int
var one = int.parse('1');
assert(one == 1);
// String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1);
// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');
// double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');
字符串单双引号的使用
// 双引号和单引号可以相互替代,没有区别
var string1 = "caoxiaokang";
print(string1);
// 三引号支持换行
String multibleLineString = '''hello
world''';
String singleLineString = "caoxk";
// 使用+拼接字符串
print(multibleLineString + "\n" + singleLineString);
// 相连字符串直接拼接
var newString = "hello" 'world';
print(newString); // helloworld
// $的使用
var string = "$multibleLineString" + "\n" + "$singleLineString";
print(string);
输出:
[Running] dart "/Users/caoxk/Demo/dart/main.dart"
caoxiaokang
hello
world
caoxk
helloworld
hello
world
caoxk
三、特殊数据类型
数组:List
xxx
字典:Map
xxx
Unicode:Runes
xxx
标志符:Symbols
xxx
四、函数
1.函数的基本格式
2.函数的缩写
isNoble(atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
对于只有一个表达式的方法,你可以选择 使用缩写语法来定义:
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
这个 => *expr*
语法是 { return *expr*; }
形式的缩写。=>
形式 有时候也称之为 胖箭头 语法。
注意:在箭头 (=>) 和冒号 (;) 之间只能使用一个 表达式 – 不能使用 语句。 例如:你不能使用 if statement,但是可以 使用条件表达式 conditional expression。
3.函数当做参数传递
代码:
// function 也是对象,是function类
var func = (message) => '!!!${message.toUpperCase()}!!!';
var result = func('hello'); //断点打在此处
print(result);
控制台中打印func变量:
func
Closure: (dynamic) => String
call:Closure
hashCode:236919621
runtimeType:Type ((dynamic) => String)
func在runtime中的类型是:参数为dynamic,返回值为String
备注:
这里如果将参数'hello'改成int类型的1,则会运行出错,报错类似于OC中的找不到方法的错误
可选命名参数
可选命名参数的意思是在定义函数时,可以指定参数的名字。这样做的好处是使得函数易于理解,可读性强。
使用方法:
type funcName({type param1, type param2}) {
......
};
举个🌰:
命名的函数及其调用方法:
// named params
void func1({bool param1, bool param2}) {
print('${param1}' + '-' + '$param2');
};
func1(param1: true, param2: false);
未命名的函数及其调用方法:
// not named params
void func2(bool param1, bool param2) {
print('${param1}' + '-' + '$param2');
}
func2(true, false);
如果直接调用命名函数则会报错:
报错.png
可选位置参数
备注
可选命名参数和可选位置参数不能同时存在,例如:
@required
?????
Required is defined in the meta package. Either import package:meta/meta.dart
directly, or import another package that exports meta
, such as Flutter’s package:flutter/material.dart
.
?????
使用@required修饰的参数书序必传参数,如果不传,编译器会报错
const Scrollbar({Key key, @required Widget child})
类型判定操作符
The as
, is
, and is!
operators are handy for checking types at runtime.
Operator | Meaning |
---|---|
as |
Typecast (also used to specify library prefixes) |
is |
True if the object has the specified type |
is! |
False if the object has the specified type |
The result of obj is T
is true if obj
implements the interface specified by T
. For example, obj is Object
is always true.
类:class
重点:
1.点方法"obj?.property/method()"等价于如果是如果不是null,则执行.后面的语句
2.有些类提供了常量构造函数。使用常量构造函数 可以创建编译时常量,要使用常量构造函数只需要用 const 替代 new 即可:
var p = const ImmutablePoint(2, 2);
3.可以使用 Object 的 runtimeType
属性来判断实例 的类型,该属性 返回一个 Type 对象。
print('The type of a is ${a.runtimeType}');
4.Dart 是一个面向对象编程语言,同时支持基于 mixin 的继承机制。 每个对象都是一个类的实例,所有的类都继承于 Object.。 基于 Mixin 的继承 意味着每个类(Object 除外) 都只有一个超类,一个类的代码可以在其他 多个类继承中重复使用。
网友评论