You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
main(List<String> args) {
int number = 18;
String name = "xiaoming";
double salary = 150300.56;
bool isDoorOpen = true;
}
2.3 const和final声明常量
main(List<String> args) {
final int number = 42;
const String name = "xiao ming";
//Omit explicitly defining data types
final salary = 150300.56;
const isDoorOpen = true;
}
main(List<String> args) {
//Numbers
int x = 100;
double y = 1.1;
int z = int.parse('10');
double d = double.parse('44.4');
//Strings
String s = "This is a string";
String backslash = "I can't speak";
//String interpolation
String interpolated = "Value of x is $x"; //Prints: Value of x is 100
String interpolated2 = "Value of s is ${s.toLowerCase()}";
//Prints: Value of s is this is a string
//Booleans
bool isDoorOpen = false;
}
3.2 常用方法
3.2.1 number 取值范围:-2^53 to 2^53
// String -> int
var one = int.parse('1');
// String -> double
var onePointOne = double.parse('1.1');
// int -> String
String oneAsString = 1.toString();
// double -> String 注意括号中要有小数点位数,否则报错
String piAsString = 3.14159.toStringAsFixed(2);
3.2.2 string
'''...''',"""..."""表示多行字符串(连续三个单引号或双引号)
r'...',r"..."表示“raw”字符串(字符串前加字母 r 则不处理转义)
可用${}引用表达式,或直接$引用标识符
示例代码:
String s = "FRONT END DEVELOPER";
print ("A Commpany has a $s, which is good idea." ==
"A Commpany has a Front End Developer," +
" which is good idea.");
print("I am a " +
"${s.toUpperCase()} is very hornor!" ==
"I am a " +
"FRONT END DEVELOPER is very hornor!");
3.2.3 bool
Dart 是强 bool 类型检查,只有bool 类型的值是true 才被认为是true
3.2.4 List
声明 List 用 new List() 或者简单的赋值
下面是一些基本操作
main(List<String> args) {
// 声明
var vegetables = new List();
//或者简单赋值声明
var fruits = ["apples", "peaches"];
// 添加元素
fruits.add("bananas");
// 添加多个元素
fruits.addAll(["grapes","oranges"]);
// 获取第一元素
fruits.first
// 获取最后一个元素
fruits.last
// 查找某个元素的索引号
assert(fruits.indexOf("apples") === 0);
// 删除指定位置的元素,返回删除的元素
fruits.removeAt(index);
// 删除指定元素,成功返回 true ,失败返回 false
fruits.remove("oranges");
// 删除最后一个元素,返回删除的元素
fruits.removeLast
// 删除指定范围的元素,含头不含尾。成功返回 null
fruits.removeRange(start, end);
// 删除指定条件的元素,成功返回null
fruits.removeWhere((item) => item.length > 6);
//删除所有元素
fruits.clear();
// sort()排序 传入一个函数作为参数,return <0 表示有小到大,>0 表示由大到小;
fruits.sort((a, b) => a.compareTo(b));
//常量 List
var list = const [1,2,3,4]; //Cannot alter elements of this list
}
//一个简单的类
class Point {
num x;
num y;
}
void main() {
var point = Point();
point.x = 4; // Use the setter method for x.
assert(point.x == 4); // Use the getter method for x.
assert(point.y == null); // Values default to null.
}
还记得吗: dart中一切未赋值的变量值都是 null;
7.1.2 构造函数
通过创建一个与类同名的函数来声明构造函数;
class Cat {
String name;
int age;
Cat(String name, int age) {
this.name = name;
this.age = age;
}
}
void main() {
Cat Tom = new Cat("Tom", 2);
print(Tom.name);
}
dart 提供了语法糖,以更简单的方式来生成构造函数;
class Cat {
String name;
int age;
Cat(this.name ,this.age)
}
void main() {
Cat Tom = new Cat("Tom", 2);
print(Tom.name);
}
main(List<String> args) {
Pug p = new Pug.small('Duffy');
print(p.name);
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
}
class Pug extends Dog {
Pug(String name, int age): super(name, age);
Pug.small(Stirng name): this(name, 1);
Pug.large(Stirng name): this(name, 3);
}
class Employee extends Person {
// Person does not have a default constructor;
// you must call super.fromJson(data).
Employee.fromJson(Map data) : super.fromJson(data) {
print('in Employee');
}
}
7.3 类中的函数
定义函数:在类里定义函数和单独定义函数是一样的;
main(List<String> args) {
Cat Tom = new Cat("Tom", 1);
Tom.eat();
}
class Cat {
String name;
int age;
Cat(this.name ,this.age)
Cat.newBorn(){
name = "Cherry";
age = 0;
}
eat(){
print("I like eating fish!");
}
}
函数重写
main(List<String> args){
Cat Cherry = new Garfield.small("jiafei");
Cherry.eat();
}
// 父类 -- 猫
class Cat{
String name;
int age;
Cat(this.name, this.age);
Cat.newBorn(){
name="dahua";
age=0;
}
eat(){
print("I like eating fish!");
}
}
// 子类 -- 加菲猫
class Garfield extends Cat{
Garfield(String name, int age): super(name,age);
Garfield.small(String name, int age): this(name, 1);
Garfield.large(String name, int age): this(name, 3);
@override
eat(){
print("I like eating small can!");
}
}
class Rectangle {
num left, top, width, height;
Rectangle(this.left, this.top, this.width, this.height);
// Define two calculated properties: 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;
}
void main() {
var rect = Rectangle(3, 4, 20, 15);
assert(rect.left == 3);
rect.right = 12;
assert(rect.left == -8);
}
class Person{
final _name; // 这是一个接口,但只能在本类中访问
Person(this.name); // 这不是接口,因为它是构造函数
String greet(String who) => "Hello $who, I am $name"; // 这是接口
}
Class Imposter Implements Person{
get _name => ""
String greet(String who) => "Hi $who, do you know who I am ?";
}
String greetBob(Person person) => person.greet("Bob");
void main(){
print(greetBob(Person("Kathy")));// Output: Hello, Bob. I am Kathy.
print(greetBob(Imposter())); // Output: Hi Bob. Do you know who I am?
}
class A {
// Unless you override noSuchMethod, using a
// non-existent member results in a NoSuchMethodError.
@override
void noSuchMethod(Invocation invocation) {
print('You tried to use a non-existent member: ' +
'${invocation.memberName}');
}
}
7.8 静态方法
在字段或方法前增加static关键字就变成了静态,如:
class Dog {
String name;
int age;
Dog(this.name, this.age);
static bark() {
print('Bow Wow');
}
}
main() {
Dog.bark();
}
静态变量在使用之前不会初始化。
静态方法(类方法)不对实例进行操作,因此无法访问它.
例如:
import 'dart:math';
class Point {
num x, y;
Point(this.x, this.y);
static num distanceBetween(Point a, Point b) {
var dx = a.x - b.x;
var dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
}
void main() {
var a = Point(2, 2);
var b = Point(4, 4);
var distance = Point.distanceBetween(a, b);
assert(2.8 < distance && distance < 2.9);
print(distance);//2.8284271247461903
}
Flutter 基础—— Dart 入门
Flutter简介
Flutter类似且优于Html、React Native、Weex等跨平台解决方案。ReactNative将JSX生成的代码最终都渲染成原生组件,JS与原生通过JSBridge传递数据。而Flutter则采用完全不同的设计,底层是一套独立的渲染引擎–Skia,所有组件也都是独立于平台的Widget组件,可以在最大程度上保证了跨平台体验的一致性。
Dart
Flutter 使用 Dart 作为开发语言,在深入flutter框架前应该先对dart语言有所了解。据说,dart语言里的API 90%以上与 Java 相同,如果你有 Java 基础,几乎可以很快上手,没有 Java 基础也不用担心,它的 API 很简单,学过 JavaScript 也可以轻松get✅;
几个重要的点:
List <int>
(整数列表)或List <dynamic>
(任何类型的对象列表)。(Dart支持顶级函数(例如main()),以及绑定到类或对象的函数(分别是静态和实例方法)。您还可以在函数内创建函数(嵌套函数或本地函数))。
这里简单介绍下:
Hello World
变量声明
数据类型
函数
流程控制
异常处理
类
泛型
异步操作
1. Hello World
和 Java 程序一样,dart程序也有一个入口函数 main ,把上面的程序保存为
hello_world.dart
, 在命令行运行:安装之后需要配置环境变量
启动 dart 程序
2. 变量声明
变量声明关键字:
var
、const
、final
、int
、String
、double
(浮点型)、bool
2.1 var 声明变量 —— 不指定类型
和 JavaScript 一样, 可以用
var
声明变量不一样的是,
dart
自带类型推断,一旦给变量赋值,它的类型就不可变了。2.2
int
、String
、double
(浮点型)、bool
声明变量——指定变量类型2.3
const
和final
声明常量3. 数据类型
3.1 dart提供基本的数据类型:
3.2 常用方法
3.2.1 number 取值范围:-2^53 to 2^53
3.2.2 string
${}
引用表达式,或直接$
引用标识符示例代码:
3.2.3 bool
Dart 是强 bool 类型检查,只有bool 类型的值是true 才被认为是true
3.2.4 List
声明 List 用 new List() 或者简单的赋值
下面是一些基本操作
3.2.5 map 散列表
基本操作
4. 函数
Dart是一种真正的面向对象语言,因此即使是函数也是对象并且具有类型Function。这意味着函数可以分配给变量或作为参数传递给其他函数。您也可以像调用函数一样调用Dart类的实例。
函数声明无需 function 关键字;
函数名前可标注函数返回类型,没有返回值的函数返回类型可设为void;
函数的参数可设定类型也可以不设
支持箭头函数
命名参数
调用命名参数的函数时,如果没有指定参数的名字,程序会崩溃报错。
参数默认值
为命名参数的某个参数指定默认值,这个参数就会变成可选参数。如上面的函数指定默认参数后可以这样调用:
5. 流程控制
...
这个流程控制语句使用和 JavaScript 没什么差异
6. 异常处理
try...catch...finaly
也跟 JavaScript 差不多。。。
7. 类 Class
7.1 类的定义
7.1.1 一个简单的类
还记得吗: dart中一切未赋值的变量值都是 null;
7.1.2 构造函数
通过创建一个与类同名的函数来声明构造函数;
dart 提供了语法糖,以更简单的方式来生成构造函数;
上面的代码只用一行代码就完成了构造函数,第一个参数,对应到name,第二个参数对应age;
命名构造函数(构造函数标识符)
上面的代码,构造函数有了一个名字(newBorn), 这样在初始化时更清楚使用了哪个类
7.2 继承
dart 的类通过 extends 关键字实现继承
调用父类构造函数
Garfield
类继承了Cat
类,并且在Garfield
的构造函数里用SUPER
关键字调用了Cat
类的构造函数,重定向构造函数:有时构造函数的唯一目的是重定向到同一个类中的另一个构造函数。重定向构造函数的主体是空的,构造函数调用出现在冒号(:)之后。
上面定义了两个命名构造函数, small 调用了自身的构造函数,而自身又调用了dog的构造函数。
7.3 类中的函数
7.4 getter setter
默认的情况下类里定义的任何变量都是可以访问的,如
dog.name
,变量的值也可以直接读写。但是有时候不希望直接读写而是通过getter
setter
。dart里 是通过get
set
关键字实现的;7.5 抽象方法和抽象类
7.6 隐式接口
一个类通过
implements
语句实现接口7.7 noSuchMethod
检测是否使用了不存在的变量或方法,可以重写
noSuchMethod
方法,否则会抛出NoSuchMethodError
这个异常;7.8 静态方法
在字段或方法前增加static关键字就变成了静态,如:
7.9 枚举类型Enum
使用enum关键字声明枚举类型:
枚举中的每个值都有一个索引getter,它返回枚举声明中值的从零开始的位置。例如,第一个值具有索引0,第二个值具有索引1。
可以通过
.values
获取枚举类中所有值的列表7.10 mixins 为类添加功能
mixins是一种在多层级结构类中重用代码的方法。
定义mixin:使用
mixin
关键字创建一个没有构造函数的扩展类来实现一个mixin。使用mixin:通过
with
关键字后跟多个类名来使用mixin;8. 泛型
Dart 支持泛型,在定义
List
和Map
类型时,可以手动指定其元素类型,类型一旦确定便不可更改,也不可向其中添加其他类型的变量。如:
同时,使用字面量定义变量时,Dart 也可以进行类型推断,如
var name = ['Seth', 'Kathy', 'Lars']
,可以推断该 List 为List<String>()
类型;不限定参数类型
如有一个类,管理一个数据,希望这个数据是任何类型。
9. 异步支持
Dart 支持异步操作。
使用异步首先要导入异步库
import: "dart/sync"
;异步操作(函数)有两种返回类型:
Future
和Streams
;Future基于观察者模式。类似于JavaScript里的Rx和Promise,如果熟悉这两个,就很容易理解Future。
简单来说,Future定义了未来将要发生的事,例如:未来我们会得到一个值。
Future 是泛型,Future,需要指定未来返回值的类型。如:
使用
async/await
关键字执行异步操作,使用try
,catch
和finally
来处理使用await
的代码中的错误;用
async
关键字修饰函数体就声明了该函数是异步函数;处理流 Stream
可用await for等待遍历stream的所有值,但要小心使用:
表达式的值必须具有Stream类型。执行过程如下:
要停止侦听流,您可以使用break或return语句,该语句将跳出for循环,并从流中取消订阅。
保证
await
、await for
要处在异步操作中参考文档:
The text was updated successfully, but these errors were encountered: