
flutter是一种基于dart语言的框架
一、dart环境搭建dart官网
需选择相应的版本下载
如果在cmd命令行中报错识别不了choco ,那么首先需要用PowerShell进行安装Chocolatey
1.win+x打开PowerShell
2.执行代码
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
3.测试安装是否成功
choco -v
4.根据官网命令安装sdk
//安装sdk choco install dart-sdk
//更新命令 choco upgrade dart-sdk
5.配置环境变量
//在系统环境变量path,中引入到dart到bin的文件目录,即可
6.测试
在命令行中输入dart --version测试一下是否引入成功
Flutter安装包
//在系统环境变量path,中引入到Flutter到bin的文件目录,即可三、dart初体验
在这里我使用的是vscode,需要下载前两个插件
运行代码
四、dart基础 一、dart介绍
Dart官方文档:
二、dart铺垫知识点Dart是谷歌发布的一门开源的计算机编程语言,后来被Ecma (ECMA-408)认定为标准。它被用于web、服务器、移动应用和物联网等领域的开发。它是宽松开源许可证(修改的BSD证书)下的开源软件。 Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为Javascript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)和sound type system。
//dart入口函数
main(){
}
//Dart的打印 print()
//Dart的注释 //这是单行注释
//Dart变量/常量的声明
String str = '124'
int num = 1
var str = '124'//自动识别数据类型
String str1 = "可";//指定数据类型
String str2 = "可";
print("$str1$str2");//输出时候字符串拼接用$变量 $变量
const num;//final可以先不用赋值,但是const声明时必须要赋值
final age;//一旦赋值都不可以再被修改
//dart变量命名规则三、dart编码规范
样式规范
1、类、枚举、类型定义,以及泛型,都需要使用大写字母开头的驼峰命名法
2、在使用元数据的时候也要使用驼峰命名法命名
3.命名库、包目录dart文件都是应该是小写加上下划线
4.将引用的库使用as转化名字也应该是小写加下划线
5.变量名、方法、参数名都应该采用小写开头的驼峰命名(常量命名使用大写)
6.花括号的用法也有一定的规范。只有一个if语句没有else的时候,并且在一行内能够很好的展现就可以不用花括号
//类规范命名
class Person{}
//类元数据
@JsonSerializable()
class AddressEntity extends Object{}
//命名库
library peg_parse.source_scanner;
//导入dart文件
import 'file_system.dart';
//引用
import 'file_system.dart' as systemjs;
赋值
//如果不为空想返回false optionThing?.isEnableed)??false
集合
//如果要使用不可扩展的列表或者其他的一些自定义集合类型,那么务必使用构造函数 var points = []; var address = Map(); //想要指定类型的时候,推荐如下写法 var points = List四、数据类型[]; var address = Map (); //不要使用.length的方法表示一个集合是否为空,使用isEmpty或者isNotEmpty //避免使用带有方法字面量的Iterable.forEach()惯用方法使用循环 for(var person in people){} //不要使用List.from()除非打算更改结果类型,有两种方法,一个是List.from()一个是Iterable.toList() //使用where过滤集合 var objects = [1,"1"]; var int = object.whereType (); //变量例子 class Cricle{ int r; final PI = 3.14; Cricle(this.r); get area => PI*this.r*this.r; } main() { var p = new Cricle(3); print(p.area); } //成员 class Container{ var width; var height; } //构造方法 class Container{ var width; var height; Container(this.width,this.height); } //尽量不要使用new来创建对象最新的Dart可以全部去掉代码中的new关键字 //不要使用过多的const修饰对象 const color = { Color(red,[255,0,0]) }; //try catch try { } catch (e) { }
常用基本数据类型Number String Boolean List Map
Number包括两类int、double,两者都属于num类型的子类
int
double //可以是整型也可以是浮点型
//数值和字符型可以相互转化
var valueDouble = int.parse('10');//double.parse('10.10')
var valueDouble = 10.toString();
var valueDouble = 10.10.toStringAsFixed(2);//保留两位小数
String类型
//字符串的表示方法 var a = "a"; var a1 = ```大块文本1```; //转义字符/t,如果把转义字符变成普通字符需要添加前缀r var r = r"n"; //字符串相接用+ //字符串插值用$(expression)
Boolean类型
//值必须为true或者false bool //true或false
List类型
//定义一个List var list = [1,2];//可以改变容量arry.length = 0;改变长度为0 //常量list var list = const[1,2]; //扩展运算符... var list = [1,2]; var list2 = [1,2,...list];
Set类型
//去重类Set
var list = new Set();//可以对集合去重,结果是对象的形式
list.add('apple');
list.toList();//转化为List类型
//添加元素
list.add("value");
list.addAll(["苹果","葡萄"]);//追加一个数组
print(list);
//获取索引值
list.indexOf('苹果');//返回索引值,查找不到返回负一
//删除元素
list.remove('葡萄');//按照元素值删除
list.removeAt(2);//按照对应的索引值,数组下标
//修改元素
list.fillRange(1, 1,'荔枝');//开始位置和结束位置都修改为该值,(数值相同不变)
//指定位置插入元素
list.insert(2, "火龙果");
list.insertAll(2, ['圣女果','菠萝蜜']);
Map类型映射了一个关联key和value
//Map集合
var person = {
"manager":"张三",
"staff":"赵六"
};
person.keys.toList();//获取他的键并且转化为集合
person.values.toList();//获取他的值并且转化为集合
person.remove("staff");
person.addAll({
"salesman":"王五"
});
person.containsValue("王五");
person.containsKey("salesman");
var arr =五、运算符["1"];//指定类型 var arry = [1,2];//可以改变容量arry.length = 0;改变长度为0 arry.add(2); var arr = List.filled(2,"");//创建固定长度的集合 var arr = List .filled(2,""); //定义Maps方法 var person = { "name": "可可", "age":18 };//定义maps集合的形式跟json数据一样需要将属性名用双引号引用起来 print(preson['age'])//调用用中括号的形式 var p = new Map(); p["name"] = "可可"; //is关键词判断
常用算术运算符
//+、-、*、~/、% a++;//先赋值后运算 ++a;//先运算后赋值,先加一后赋值 a~/b//取整
常用关系运算符
//==、!=、>、<、>=、<=
常用类型测试 *** 作符
//as、is、is!
赋值运算符
//=、??= int b=20; b??=10; //如果b没有初始值那么就把10赋值给b var a; var b = a ?? 20; print(b);//20因为a一开始没有默认值
逻辑运算符
//!、||、&&
位运算符
//&、|、^、~、<<、>>
条件表达式
condition?expr1:expr2 expr1??expr2
级联运算符
//..六、流控制语句
- if和elsefor循环while和do whilebreak和continueswitch和caseassert断言try-catch和throw
main() {
List list = [
{"title": "111"},
{"title": "222"},
{"title": "333"}
];
for(int i = 0; i < list.length; i++){
print(list[i]['title']);
}
}
main() {
List list = [
{
"title": "111",
"news": [
{
"homenews": "央视新闻1",
},
{"homenews": "外媒新闻1"}
]
},
{
"title": "222",
"news": [
{
"homenews": "央视新闻2",
},
{"homenews": "外媒新闻2"}
]
},
{
"title": "333",
"news": [
{
"homenews": "央视新闻3",
},
{"homenews": "外媒新闻3"}
]
}
];
for (int i = 0; i < list.length; i++) {
for(int j = 0; j < list[i]['news'].length; j++){
print(list[i]['news'][j]['homenews']);
}
}
}
求1-100的和
//求1-100的和
var i = 1;
var sum = 0;
while(i <= 100){
sum +=i;
i++;
}
print(sum);
//forEach只能传入一个值
List list = ["苹果","橘子","香蕉"];
list.forEach((item){
print(item);//????
});
switch(today){
case 'Monday':
print("today is monday");}
//assert,语句来中断正常执行的流程,当assert判断为false时发生中断,assert的判断为true便继续执行下面的语句 assert(text != null);七、函数
函数的概念
Dart是一个面向对象的语言,函数属于Function对象。函数可以像参数一样
传递给其它函数,这样便于做回调函数。
int max(int a,int b){
return a >= b?a:b;
}
//箭头函数=>语法简写函数相当于{return expr;}的简写
int max(int a,int b)=>a>b?a:b;
//箭头函数代码只能写一行
main(){
List list = ["苹果","香蕉","西瓜"];
list.forEach((value)=>print(value));
}
可选参数
Dart语言中可选参数分为以下两种:
命名参数:使用大括号{}括起来的参数
位置参数:使用中括号[]括起来的参数
//位置参数
void printInfor(String name,[String from = "中国"]){}
printInfor("华夏儿女","中国");
命名参数
指定格式命名的参数叫做命名参数
//命名参数通常是是一种可选参数,如果用户想要强制传入这个参数可以使用required注解来声明这个参数
setInfor(String name,int age,{required int id,required String address})=>"${id} ${address}";
main() {
print(setInfor("张三",21,id:2022,address:"北京"));
}
main函数
//跟java一样是一个程序的入口函数
匿名函数
//跟js一样没有名字的函数但是具备函数的功能,可以称作为闭包
//匿名方法
main(){
var ff = (){
print(1);
};
ff();
}
//自执行方法
main(){
((){
print("object");
})();
}
main(){
List list = ["苹果","香蕉","西瓜"];
list.forEach((value)=>print(value));
}
八、面向对象基础
面向对象的叙述
面向对象是相对面向过程的一种编程语言,具备和基础混入的继承,每一个对象都是一个实例,所有的类都派生来自Object
//面向对象的基本特征:封装、继承、多态、抽象
//Dart语言类有几部分构成:类名、成员变量、成员方法、构造方法
//类声明格式如下
[abstract] class className [extends superClassName] [implements interfaceName] [with className1,className2...]{//类体}
class className{
[static][const][final] type name;//成员变量
String run(){
return "人类会跑步";//成员方法
}
}
//方法的使用
void getName(){
print("name");
}
String getID(){
print("getID");
}
int age(){
print("age");
}
main(){
getName();
}
//获取方法的值
int age(){
return 18;
}
main(){
var value = age();
print(value);
}
//方法传入参数
int setAge(int age){
return age;
}
main(){
print(setAge(19));
}
//
int setAge(int age,[int id]){
if(id != null){
print("age:$age id:$id");
}else
return age;
}
main(){
setAge(19,2022);
}
//静态变量(类变量)不需要实例化就能访问的变量用static修饰
//非静态方法必须实例化之后进行访问,用this访问静态属性
//静态方法不能 *** 作示例,因此不能访问this
//静态方法里面不能访问非静态属性和方法
//非静态属性和方法可以直接调用静态属性的方法
//类,main外面,首字母大写
class Person{
String name = "可可";
int age = 18;
void getName(){
print(this.name);
}
}
main(){
var p1 = new Person();
p1.getName();
}
//
//类,main外面,首字母大写
class Person{
String name = "可可";
void getName(){
print(this.name);
}
void setName(String name){
this.name = name;
}
}
main(){
var p1 = new Person();
p1.setName("coco");
p1.getName();
}
//实例化的时候处触发默认构造函数
class Person{
String name = "可可";
void getName(){
print(this.name);
}
void setName(String name){
this.name = name;
}
Person(){
print("这是默认构造函数!");
}
}
main(){
var p1 = new Person();
}
//通过默认构造方法传值
class Person{
String name;
void getName(){
print(this.name);
}
void setName(String name){
this.name = name;
}
Person(String this.name){
}
}
main(){
var p1 = new Person("coco");
p1.getName();
}
//命名构造函数
//类,main外面,首字母大写
class Person{
String name;
void getName(){
print(this.name);
}
void setName(String name){
this.name = name;
}
Person(String this.name){
}
Person.now(){
print("这个是命名构造函数");
}
}
main(){
new Person.now();
}
List list = ["香蕉","苹果"];
print(list.length);
print(list.reversed);
print(list.isEmpty);
print(list.isNotEmpty);
//集合和字符串类型转化
List list = ["香蕉","苹果"];
var str = list.join(',');//集合类型转化为字符串
var value = str.split(',');//字符串转化为集合类型
print(value);
//直接修改集合中的值
List list = [1,2,3];
var list_1 = list.map((value){
return value*2;
});
print(list_1.toList());
//条件判断,满足条件的返回
List list = [1,2,3];
var list_1 = list.where((value){
return value>2;
});
print(list_1.toList());
//只要有一个满足条件就返回true
List list = [1,2,3];
var list_1 = list.any((value){//只要有一个满足条件就返回true
return value>2;
});
print(list_1);
//只要有一个不满足条件就返回false
List list = [1,2,3];
var list_1 = list.every((value){
return value>2;
});
print(list_1);
//forEach获取值
main(){
List list = ["苹果","香蕉","西瓜"];
list.forEach((value)=>{
print(value)
});
}
//递归
main(){
var sum = 1;
computedNum(int n){
sum *= n;
if(n == 1){
return sum;
}
computedNum(n-1);
}
computedNum(5);
print(sum);
}
//闭包,变量常驻内存不污染全局
main(){
ff(){
var n = 123;
return(){
n++;
print(n);
};
}
var b = ff();
b();
}
九、对象
对象是面向对象程序设计的核心,所谓对象就是在真是世界中的尸体,对象与实体是一一对应的,也就是说现实生活中么一个实体就是一个对象,它是一种具体的概念。类的实例化可以生成对象,实例的方法就是对象的方法,实例的变量就是对象属性。对象有如下特点:
对象具有属性和行为
对象具有变化的状态
对象具有唯一性
对象都是某个类的实例
创建对象
//声明对象即要创建一样类型的对象 Person name;//Person是一个类
实例化
//实例化即为对象分配内存空间,然后调用构造方法初始化对象 Person p = Person();//最新的Dart不需要使用new关键字进行实例化对象,p在初始化时为空最好加一个条件判断p != null;
对象成员
//应一个点来引用实例变量或者实例方法
构造方法
//构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象之后自动调用,如果构造方法,会提供一个无参数的构造方法
class Person{
String name;
Person(String name){
this.name = name;//this指向当前引用实例
};}
//语法糖,简化构造方法
class Person{
String name;
Person(this.name);
}
命名构造方法
//Dart不支持构造方法重载,无法像java语言一样使用不同的个参数来实现构造方法
class Person{
String name;
Person(this.name);
Person.run(){
print("这是命名构造方法");
}
}
调用父类的非默认非默认构造方法
//总结执行顺序如下 //初始化列表->父类无参数、构造方法->子类无参构造方法
//dart加私有加下划线_name
import 'bin/Person.dart';
main(){
Person p = new Person("");
p.exeturn();
}
//只能通过类里面的方法调用私有方法
class Person{
String name;
int age = 18;
void getName(){
print(this.name);
}
void setName(String name){
this.name = name;
}
Person(String this.name){
}
Person.now(){
print("这个是命名构造函数");
}
_getAge(){
print(this.age);
}
void exeturn(){
this._getAge();
}
}
//get计算属性
class Rect{
int height;
int width;
Rect(this.width,this.height);
get area{
return this.width*this.height;
}
}
import 'bin/computedArea.dart';
main(){
var p = new Rect(10,10);
print(p.area);
}
//set计算属性
import 'bin/computedArea.dart';
main(){
var p = new Rect(10,10);
p.widthFn = 6;
print(p.area);
}
//实例化之前初始化列表
class Rect{
int height;
int width;
Rect():height=10,width=10;
get area{//get计算属性
return this.width*this.height;
}
set widthFn(value){
this.width = value;
}
}
class Teacher{
var name;
var age;
var id;
Teacher(name,age);
void printResult(){
print("${this.name} ${this.age}");
}
}
main(){
var p = new Teacher("张三",12);
p..name="赵六"
..age=12
..printResult();
}
//构造函数
class Teacher {
var name;
var age;
var id;
Teacher(this.name, this.age);
void printResult() {
print("${this.name} ${this.age}");
}
}
class Web extends Teacher {
String idName;
Web(name, age,this.idName) : super(name, age){
this.idName = idName;
}//ctrl+shift+
@override
void printResult() {//复写方法,首先调用子类的方法
print("姓名${this.name} 年龄${this.age}");
}
}
main() {
var p = new Web("张二",20,"2010");
p.printResult();
}
//在子类中调用父类的构造方法用super
class Teacher {
var name;
var age;
var id;
Teacher(this.name, this.age);
void printResult() {
print("${this.name} ${this.age}");
}
void call(){
print("object");
}
}
class Web extends Teacher {
run(){
super.call();
}
String idName;
Web(name, age,this.idName) : super(name, age){
this.idName = idName;
}//ctrl+shift+
@override
void printResult() {//复写方法,首先调用子类的方法
print("姓名${this.name} 年龄${this.age}");
}
}
main() {
var p = new Web("张二",20,"2010");
p.printResult();
p.run();
}
//抽象类不能被实例化
abstract class Animal{
run(){
print("object");
}
}
class cat extends Animal{
@override
run() {
print("这个是cat方法");
}
}
main() {
var p = new cat();
p.run();
}
//子类的实例调用父类的引用
abstract class Animal{
run(){
print("object");
}
}
class cat extends Animal{
@override
run() {
print("这个是cat方法");
}
}
main() {
Animal p = new cat();
p.run();//只能调用父类中已经存在的方法
}
//implements 接口就是定义一些标准
abstract class DB{
String url;
add(var data);
remove();
del();
}
class mysql implements DB{
@override
String url;
@override
add(data) {
print("这是mysql的add方法"+data);
}
@override
del() {
return null;
}
@override
remove() {
return null;
}
}
main() {
var p = new mysql();
p.add("数据");
}
//可以继承多个接口
class Person{
String name;
Person(this.name);
get setName{
print(this.name);
}
}
class A{
String age;
}
class B{
String id;
}
class C extends Person with B,A{
C(String name) : super(name);
}
main() {
//所有类都是继承Object中的方法
}
//如果有相同的方法,后面类覆盖前面的类。A,B就是C的超类
class Person {
String name;
Person(this.name);
get setName {
print(this.name);
}
printFn() {
print("Person");
}
}
class A {
String age;
printFn() {
print("A");
}
}
class B {
String id;
printFn() {
print("B");
}
}
class C extends Person with A, B {
C(String name) : super(name);
}
main() {
var p = new C("张三");
p.printFn();
}
//泛型在方法中的使用
getData(T data){
return data;
}
class Demo{
List list = [];
void add(T value){
this.list.add(value);
}
void getList(){
print(this.list);
}
}
main() {
Demo p = new Demo();
p.add("张三");
p.add(12);
p.getList();
}
//接口泛型指定 abstract class Cache{ getByKey(String key) {} setByKey(String key, T value) {} } class FileCache implements Cache { getByKey(String key) {} setByKey(key, T value) {} } class MemoryCache implements Cache { @override getByKey(String key) { return null; } @override setByKey(String key, T value) { print("${value}"); } } main() { MemoryCache p = new MemoryCache
class A{
String name;
int age;
A(this.name,{required this.age});
}
main() {
var p = new A("name", age: 123);
}
//late
class Cricle{
late int r;
final PI = 3.14;
Cricle(int r){
this.r = r;
}
get area => PI*this.r*this.r;
}
main() {
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)