本人是一名Android开发,这是我的在学习flutter的过程当中对dart的一些学习总结和本身的理解,若是发现什么写的不对的地方,请勿喷java
本文只是简单介绍开发flutter的dart的经常使用用法,强烈建议阅读官方文档dart中文网地址es6
由于 Flutter 须要使用Dart语言开发;express
用var定义一个可变类型的变量json
var name = 'Bob';
name = 1;
name = false;
复制代码
定义具体类型的变量数组
String name = 'Bob'; // 定义一个字符串变量
bool flag = false; // 定义一个布尔类型变量
int age = 10; // 定义一个整数变量
复制代码
建议:成员变量使用具体的类型,var只在局部变量中使用。代码风格bash
支持使用final和const定义常量闭包
final name = 'Bob';
const bar = 1000000;
const atm = 1.01325 * bar;
复制代码
建立不变的值异步
var foo = const []; // 定义一个不可变的集合
boo.add(1); // error
复制代码
定义常量构造函数async
class A {
const A();
}
A a1 = const A();
A a2 = const A();
print(a1 == a2); // true
复制代码
var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = "expression $s2";
var s4 = "expression ${s2.toUpperCase()}";
var s5 = ''' You can create multi-line strings like this one. ''';
var s6 = """This is also a multi-line string.""";
复制代码
// 定义class Person
class Person {
// In the interface, but visible only in this library.
final _name;
// Not in the interface, since this is a constructor.
Person(this._name);
// In the interface.
String greet(who) => 'Hello, $who. I am $_name.';
}
// 定义Imposter 实现Person隐式的interface
class Imposter implements Person {
// 须要实现interface _name属性
final _name = "";
// 须要实现interface greet方法
String greet(who) => 'Hi $who. Do you know who I am?';
}
// 定义Imposter1 继承Person类
class Imposter1 extends Person {
Imposter1(name) : super(name);
}
复制代码
定义抽象类ide
abstract class AbstractContainer {
// 抽象方法不须要用abstract修饰符
void updateChildren();
}
// 继承抽象类
class SpecializedContainer extends AbstractContainer {
// 实现抽象方法
void updateChildren() {
// ...Implement updateChildren()...
}
}
// 实现抽象类AbstractContainer 隐式的interface
class SpecializedContainer1 implements AbstractContainer {
// 实现interface的方法
void updateChildren() {
// ...Implement updateChildren()...
}
}
复制代码
class A {
void printA() {
print("A");
}
}
class B {
void printB() {
print("B");
}
}
abstract class C {
void printC();
}
// 第一种使用Mixin的方式
class D extends A with B, C {
@override
void printC() {
print("C");
}
void printD() {
print("D");
}
}
// 第二种使用Mixin的方式
// 这种方法没法定义class的实体
// 由于C 是有一个抽象方法,因此定义的E 须要abstract声明
abstract class E = A with B, C;
class E1 extends E {
@override
void printC() {
print("C");
}
void printE() {
print("E");
}
}
D d = new D();
d.printA(); // A
d.printB(); // B
d.printC(); // C
d.printD(); // D
print(d is C); // true
print(d is B); // true
print(d is A); // true
E1 e1 = new E1();
e1.printA(); // A
e1.printB(); // B
e1.printC(); // C
e1.printE(); // E
print(e1 is E); // true
print(e1 is C); // true
print(e1 is B); // true
print(e1 is A); // true
复制代码
命名构造函数
class Person {
String firstName;
// 命名构造函数
Person.fromJson(Map data) {
print('in Person');
}
}
class Employee extends Person {
// 必需调用父类的构造函数
Employee.fromJson(Map data) : super.fromJson(data) {
print('in Employee');
}
}
class Point {
num x;
num y;
Point(this.x, this.y);
// 初始化 x、y 参数列表
Point.fromJson(Map jsonMap)
: x = jsonMap['x'],
y = jsonMap['y'] {
print('In Point.fromJson(): ($x, $y)');
}
}
main() {
var emp = new Employee.fromJson({});
}
复制代码
常量构造函数
class ImmutablePoint {
final num x;
final num y;
const ImmutablePoint(this.x, this.y);
static final ImmutablePoint origin =
const ImmutablePoint(0, 0);
}
复制代码
工厂方法构造函数
class Logger {
final String name;
bool mute = false;
// _cache is library-private, thanks to the _ in front
// of its name.
static final Map<String, Logger> _cache =
<String, Logger>{};
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final logger = new Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
void log(String msg) {
if (!mute) {
print(msg);
}
}
}
var logger = new Logger('UI');
logger.log('Button clicked');
复制代码
class Rectangle {
num left;
num top;
num width;
num 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;
}
复制代码
// if else
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
} else {
car.putTopDown();
}
// for循环
var message = new StringBuffer("Dart is fun");
for (var i = 0; i < 5; i++) {
message.write('!');
}
// for-in循环
var collection = [0, 1, 2];
for (var x in collection) {
print(x);
}
// while 循环
while (!isDone()) {
doSomething();
}
// do-while 循环
do {
printLine();
} while (!atEndOfPage());
// switce case语句
var command = 'OPEN';
switch (command) {
case 'CLOSED':
executeClosed();
break;
case 'PENDING':
executePending();
break;
default:
executeUnknown();
}
复制代码
// ?.操做符
var p = new Point(2, 2);
p?.y = 4;
// ?? 操做符
b ??= value; // 若是 b 是 null,则赋值给 b;
// 级联操做符(..)
// 第一个方法 querySelector() 返回了一个 selector 对象。 后面的级联操做符都是调用这个对象的成员, 并忽略每一个操做 所返回的值
querySelector('#button') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
复制代码
Dart 中数组就是 List 对象 简单建立list
var list1 = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);
list[1] = 1;
assert(list[1] == 1);
复制代码
使用构造函数建立list
var list2 = new List();
list2.add(1);
assert(list2[0] == 1);
复制代码
简单建立 map
var gifts = {
// Keys Values
'first' : 'partridge',
'second': 'turtledoves',
'fifth' : 'golden rings'
};
复制代码
使用 Map 构造函数建立Map
var gifts = new Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
复制代码
// 简单的定义一个方法
bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}
// => expr表达式用法
// 注意: 在箭头 (=>) 和冒号 (;) 之间只能使用一个 表达式 – 不能使用 语句。 例如:你不能使用 if statement,可是能够 使用条件表达式
bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
复制代码
可选命名参数: 在定义方法的时候,使用 {param1, param2, …} 的形式来指定命名参数, 调用方法的时候,你可使用这种形式 paramName: value 来指定命名参数
// 定义
enableFlags({bool bold, bool hidden}) {
// ...
}
// 定义带有默认值的方法
void enableFlags1({bool bold = false, bool hidden = false}) {
// ...
}
// 使用
enableFlags(bold: true, hidden: false);
复制代码
可选位置参数:把一些方法的参数放到 [] 中就变成可选 位置参数了
String say(String from, String msg, [String device = 'carrier pigeon', String mood]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
if (mood != null) {
result = '$result (in a $mood mood)';
}
return result;
}
// 不使用可选参数
say('Bob', 'Howdy'); // Bob says Howdy
// 使用可选参数
say('Bob', 'Howdy', 'smoke signal'); // Bob says Howdy with a smoke signal
复制代码
try {
// do something
} on Exception catch (e) {
print(e);
// 从新抛出这个异常
rethrow;
} catch (e) {
print(e);
// 抛出任意的对象
throw 'Out of llamas!';
} finally {
print("finally");
}
复制代码
// 定义支持的泛型类
abstract class Cache<T> {
T getByKey(String key);
setByKey(String key, T value);
}
// 定义泛型函数
T first<T>(List<T> ts) {
// ...Do some initial work or error checking, then...
T tmp ?= ts[0];
// ...Do some additional checking or processing...
return tmp;
}
复制代码
enum Color {
red,
green,
blue
}
复制代码
checkVersion() async {
var version = await lookUpVersion();
if (version == expectedVersion) {
// Do something.
} else {
// Do something else.
}
}
try {
checkVersion();
} catch (e) {
print(e);
}
// 在循环中使用异步
await for (var request in requestServer) {
handleRequest(request);
}
复制代码
typedef int Compare(Object a, Object b);
class SortedCollection {
Compare compare;
SortedCollection(this.compare);
}
// Initial, broken implementation.
int sort(Object a, Object b) => 0;
main() {
SortedCollection coll = new SortedCollection(sort);
assert(coll.compare is Function);
assert(coll.compare is Compare);
}
复制代码
使用 import 来指定一个库如何使用另外 一个库。
// 导入内置的库
import 'dart:async';
import 'dart:io';
// 导入其余的库
import 'package:flutter/material.dart';
// 使用库的前缀来解决冲突
import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;
// Import only foo.
import 'package:lib1/lib1.dart' show foo;
// Import all names EXCEPT foo.
import 'package:lib2/lib2.dart' hide foo;
// 延迟载入库
import 'package:deferred/hello.dart' deferred as hello;
greet() async {
await hello.loadLibrary();
hello.printGreeting();
}
复制代码