因为flutter 是用的dart语法,我的以为,工欲善其事,必先利其器,知道了由什么写的,后面就不难啦。设计模式
Mac 安装bash
一.安装homebrew后执行闭包
brew tap dart-lang/dart
brew install dart // 安装稳定版
brew install dart --devel // 安装开发版
安装完成后查看路径
复制代码
brew info dart
配置环境变量,找到~/.bash_profile,添加一句,路径为刚刚查到的
export PATH=/usr/local/Cellar/dart/2.1.0/bin:$PATH
复制代码
三.在vscode中使用dartide
新建文件,eg:main.dart函数
安装code runner扩展程序,每次点击右上角的三角形图标便可执行dart编译。这个扩展程序蛮好用的,能够支持多种语言的编译。ui
void main(){}
复制代码
使用var
声明变量,可赋予不一样的值this
未初始化时,默认值为null
spa
使用final
声明一个只能赋值一次的变量设计
使用const
声明常量code
使用const
声明的必须是编译期常量
共有Number、String、Boolean、List(列表)、Map(键值对)、Runs(不经常使用)、Symbols(不经常使用)
分为 包括 int(整型)和double(浮点型)
num a = 10; // num 型能够指定浮点和整型
a =10.2;
int b = 10;
// b = 11.11; // ❌ 具体的类型声明后不能再赋予为浮点型了
复制代码
+,-、*、/ 、 ~/(取整)、%(取余)
复制代码
isNaN(是不是非数字)、isEven(是不是偶数)、isOdd(是不是奇数)
复制代码
abs() // 绝对值
round() // 向下取整
floor() // 向上取整
ceil()
toInt() 、toDouble()
复制代码
使用单引号或双引号建立字符串
使用三个引号建立多行字符串
bool aa = true;
复制代码
var list = new List<dynamic> ();
list..add('1')..add(2)..add(true);
print(list); // ['1',2,true] 动态添加不一样类型的值
复制代码
算数运算符
+ - * / ++ --
关系运算符
> < >= <= !=
String str1 ='123';
String str2 = '123';
print(str1 == str2); //true
复制代码
逻辑运算符
赋值运算符
int m;
m ??= 10;
print(m); //10,若初始值有值则??=后面的值不赋值,若无值则赋值
int m = 5;
m ??= 10;
print(m); // 5
复制代码
条件表达式
String cc;
String cd ='dart';
String c = cc ?? cd;
print(c); //'dart' 若是前面有值就用前面的没值就用后面的
复制代码
if
for
var list =['咱们','要永远','在一块儿'];
for(var index = 0;index<list.length;index++){
print(list[index]);
}
for(var item in list){
print(item);
}
复制代码
void main(List args){} //第一个表示返回类型,void 表达不须要返回类型,括号里面表示传参
复制代码
String getPerson(String name,int age){
return 'name=$name;age=$age';
}
复制代码
printPerson('niuxialing', 18); //name=niuxialing age=18 gender=null
printPerson('fff',19,gender:'girl'); //name=fff age=19 gender=girl
printPerson1('xiaoling',18,'boy'); //name=xiaoling age=18 gender=boy
printPerson(name,age,{String gender}){
print('name=$name age=$age gender=${gender}'); // 花括号参数能够随意组合传过去
}
printPerson1(name,[int age,String gender]){
print('name=$name age=$age gender=${gender}'); // 中括号必须按照顺序传
}
复制代码
正常参数必须在可选参数的前面
void main(){
List list = ['i','am','a'];
print(listChange(list,times)); // 传一个函数做为参数
}
List listChange(List list,String times(String str)){ 注意:参数定义了类型,函数下面也要定义类型,不然会报错
for(var index = 0; index < list.length;index++){
list[index] = times(list[index]);
}
return list;
}
String times(String str){
return str * 3;
}
复制代码
//方式一 赋值给变量调用
var fun = (str){
print('print hello -${str}');
};
fun('niuxiaoling');
// 方式二 自执行
((){
print('调用');
})();
// 方式三 在其余方法中调用
List listTimes(List list){
var fun = (str){ // 匿名函数
return str*3;
};
for(var index = 0; index<list.length;index++){
list[index] = fun(list[index]);
}
return list;
}
复制代码
void main(){
var f = fun();
f();
}
fun(){
var count = 0;
return (){
print('aa=$count');
};
}
复制代码
与Java 很类似
class
声明一个类new
建立一个对象,new可省略Object
类setter
和getter
方法final
声明的属性只有getter方法,就是说不能设置library(库)
为单位计算属性是计算而来的,自己并不存储值,计算属性赋值是经过计算转换到其余实例变量上面的。
set
和get
方法void main(){
print(rec.area); // 是属性,不是方法
}
num get area{
return width * height;
}
复制代码
void main(){
rec.area = 200;
print(rec.width); //180
}
set area(value){
width = value -20 ;
}
复制代码
class Person{
Person(){} //构造函数
}
复制代码
方式一(语法糖经常使用 的)
class Person{
String name;
int age; final String gender;
Person(this.name,this.age,this.gender); // 此时的初始化赋值在构造函数以前,因此能够修改final 声明的属性
}
复制代码
方式二
class Person{
String name;
int age;
final String gender;
Person(String name ,int age,String gender){
this.name = name;
this.age = age;
this.gender = gender; // 此时会报错,由于final声明的属性不能修改
}
String work(){
return '$name is $age,but he is working hard,he is a $gender';
}
}
复制代码
void main(){
var alice = Person.getName('alice');
}
class Person{
String name;
Person.getName(this.name);
}
复制代码
void main(){
const a = Person('xiaoling',19);
}
class Person{
final String name;
final int age;
const Person(this.name,this.age); // 必须前面加const
}
复制代码
factory
实现一个工厂构造方法class Factory{
final String name;
factory Factory(String name){ //工厂构造方法能够返回对象
return Factory._inter(name); // 返回对象
}
Factory._inter(this.name); // 类私有的命名构造函数
}
复制代码
final
变量的值void main(){
var a = Person.mapValue({'name':'xoaling','age':19});
}
class Person{
String name;
int age;
final String gender;
Person.mapValue(Map map): name= map['name'],gender = map['gender']{
this.age = map['age'];
}
}
复制代码
static
关键字实现类级别的变量和函数static const
来声明void main(List<String> args) {
var page = new Page();
page.scrollUp() //报错
Page.scrollDown(); // 能够用类直接返回静态方法
}
class Page{
static const maxPage = 10; //常量必须加关键词static
static int currentpage = 1;
static void scrollDown(){
currentpage = 1;
print('scrollDown...');
}
void scrollUp(){
currentpage++;
print('scrollUp...');
}
}
复制代码
void main(List<String> args) {
Person person = new Person();
person?.work(); //如有这个属性就执行,若没有就什么都不作
}
class Person{
String name;
int age;
void work(){
print('working');
}
}
复制代码
var person;
person = '';
person = new Person();
(person as Person).work(); // 变量名赋值过多的状况下,不知道类型具体是啥,须要进行类型转换
复制代码
if(person is Person){
person.work();
}
复制代码
person..name='tom'
..age = 10
..work();
一直执行,用分号结束
复制代码
call()
方法,则该类的对象能够做为方法使用void main(){
var person = Person();
peron('hah'); // name = hah
}
class Person{
String name;
int age;
String call(String name){
return 'name = $name';
}
}
复制代码
extends
继承一个类void main(){
var student = new Student();
print(student.isAudit); //true
}
class Person{
String name;
int age;
bool get isAudit => age>18;
void run(){
print('run,,');
}
}
class Student extends Person{
void study(){
super.run();
print('study....');
}
@override // 重写父类方法
bool get isAudit => age>=10;
}
复制代码
void main(){
Student student = Student();
}
class Person{
Person(){
print('父类的构造方法');
}
}
class Student extends Person{
int age;
}
复制代码
void main(){
Student student = Student('tom');
}
class Person{
String name;
Person(this.name){
print('父类的构造方法');
}
Person.widthName(this.name);
}
class Student extends Person{
Student(String name) : super(name);
}
复制代码
class Student extends Person{
int age;
final String gender;
Student(String name,String gender): gender = gender,super.widthName(name);
}
复制代码
abstract
表示。不能直接被实例化abstract
实现,无实现的implements
void main(List<String> args) {
var teacher = new Teacher();
teacher.study(); // teacher 同时拥有3个类的方法
}
class Student1{
void study(){
print('student1 study...');
}
}
class Student2{
void run(){
print('student2 study...');
}
}
class Student3{
void singer(){
print('student3 study...');
}
}
// 若须要Teacher同时拥有上面3个学生的类,用继承
class Teacher extends Student1 with Student2,Student3{
}
复制代码
with
链接一个或多个mixin格式 返回类型 关键字operator (参数1,参数2){
实现体
return 返回值
}
复制代码
可覆写的操做符
[]=
>
<
|
/
~/
^
>>
<<
%
[]
*
&
>=
<=
void main(List<String> args) {
var person1 = new Person(19);
var person2 = new Person(30);
print(person1>person2);
print(person1['age']);
print(person1 == person2);
}
class Person{
int age;
Person(this.age);
bool operator >(person){ //定义操做符>
return this.age > person.age;
}
int operator [](String str){ //定义操做符[]
if('age' == str){
return this.age;
}
return 0;
}
}
复制代码
enum
定义一个枚举void main(){
var colorbox = Colors.blue;
print(colorbox.index); // 获取index
switch(colorbox){
case Colors.blue:
print('blue');break;
case Colors.green:
print('green');break;
case Colors.red:
print('red');break;
}
}
enum Colors{
red,
green,
blue
}
复制代码
在属性上使用泛型
void main(){
var a = new Type<int>();
a.input(1);
var b = new Type<String>(); // 在属性上使用泛型
b.input('sss');
}
class Type<T>{
T element;
void input(T element){
this.element = element;
print(this.element);
}
}
复制代码
void main(){
var p1 = new Person();
p1.input<int>(1);
p1.input<String>('sss');
}
class Person{
void input<T>(T element){
if(T == int){
print('只能输入数字');
}
if(T == String){
print('只能输入字符串');
}
}
}
复制代码