因为Flutter的开发语言是Dart,所有必须得知道Dart的语法,对于学过java或者Python等语言的来说,上手还是比较轻松的。
如果不知道Flutter能优缺点,或者Flutter在android studio配置环境。Flutter学习第一天:小伙花饭钱去买Flutter教学视频,只为了知道Flutter是否支持双系统开发?
如果想了解Dart的数据类型可以看看这篇博客:Flutter学习第二天:Dart常用数据类型(int,num,double,bool,List,Map)以及方法大总结。
我学习视频的那个老师博客地址,老师说的很不错,清晰易懂。
1.构造方法
一个小知识:dart语言是前面加一个下划线来实现变量或者方法为私有属性或者私有方法
。
String _school; //私有属性
_learn(){
print("_learn私有方法");
}
个人觉得构造方法的形式和java还是很像的。
Dart语言的构造方法
class Person{
String name;
int age;
Person(this.name,this.age);
}
继承父类实现构造方法。
小知识点:作为一个合格程序员,符合标准肯定很重要。
解释说明注释:需要用//来注释,而不是通/* */注释
。
文档注释:需要用///来注释,而不是通过/** ... */注释
。
所以和java的标准还是有一些区别的。如果想了解更多Dart小知识可以去这个链接进行学习,文章很详细。
///这里的Person是指上方那个类
class Student extends Person{
//定义类的变量
String _school; //通过下划线来识别私有字段(变量)
String city;
String country;
String name;
///构造方法:
///通this._school初始化自有参数
///name,age交给父类进行初始化
///city为可选参数
///country默认参数
Student(this._school,String name, int age,
{this.city,this.country='China'})
: //初始化列表:除了调用父类构造器,在子类构造器方法体之前,你也可以初始化实例变量,
name='$country.$city',
super(name, age);
}
上方代码进行解析:我们可以==看到_school是Student的初始化自有参数,name,age交给父类Person进行初始化,city是可选参数(可选参数的意思你创建一个新对象可选择赋值,或者不赋值),country是默认参数,上面country的默认国家是china==。下方代码进行解释:
与java的区别:dart新建对象时,不需要new对象,直接给你个对象他不香吗
。[图片上传失败...(image-3e1fa2-1611455158081)]
//因为city,country是可选参数,可写,可不写,如最下方
Student stu=Student("大学", "小罗", 20,city: "长沙",country: "china");
Student stu=Student("大学", "小罗", 20);
2.命名构造方法
==命名构造方法=类名+方法名==
命名构造方法的好处:可以通过类名+多种方法来构造多种构造方法。
Student类指的是上方构造方法中的那个类。下面两个都是命名构造方法。
Student.cover(Student stu):super(stu.name,stu.age);
Student.now(){
print("我是命名构造函数!");
}
3.工厂构造方法
工厂构造方法和我们设计模式课学的单例模式
挺像的,单例模式总共有8种,这个是最基础的懒汉式单例。主要功能就是不管你新建多少个对象,都是同一个对象
。下方有实例。
class Logger{
static Logger _cache;
///工厂构造方法
factory Logger(){
if(_cache==null){
_cache=Logger._internal();
}
return _cache;
}
检测是否为工厂构造方法:
你可以试一下,结果返回的是true。
Logger logger1=Logger();
Logger logger2=Logger();
print(logger1==logger2);
4.命名工厂构造方法
==命名工厂构造方法=类名+方法名==
和命名构造方法
的功能差不多。
factory Student.stu(Student stu) {
return Student(stu._school, stu.name, stu.age,
city: stu.city, country: stu.country);
}
5.setters和getters方法
setters和getters方法只有私有属性
才有,在方法前面加一个下划线_即可属性私有属性。
例如:
String _school;
//_school的getters方法
String get school => _school;
//_school的setters方法
set school(String value) {
_school = value;
}
从上方可以看到和java的getters和setters方法还是有很多异同的地方。如果你忘记写了的话,可以通过下图中形式进行自动生成,和我们android的使用差不多。
6.静态方法
和java差不多,就不一 一说明了。
static doPrint(String str) {
print('doPrint:$str');
}
7.抽象方法
使用 abstract 修饰符来定义一个抽象类,该类不能被实例化
。和java的使用也差不多。
abstract class Study{
void study();
}
class StudyFlutter extends Study{
@override
void study() {
// TODO: implement study
print("努力学习呀");
}
}
8.mixins
这个是java没有的,是dart所独有的特征。
1.mixins :在多个类层次结构
中重用代码的一种方式。
2.mixins :在 with 关键字
后面跟一个或多个 mixin 的名字(用逗号分开
),并且with要用在extends关键字之后
。
如下方Test需要重用Person,Study类的方法,因为extends只能继承一个类。
class Test extends Person with Study {
Test(String name, int age) : super(name, age);
@override
void study() {
// TODO: implement study
}
}
9.泛型
关于泛型的作用可以看一下这个大佬博客,very详细泛型
[图片上传失败...(image-d1ea6c-1611455158082)]
我这里展示一下泛型的使用:
泛型的功能是增加代码的复用
,减少了强制转化
,如下方代码,已经可以确定cache1.getItem('cache1')输出为String型,不要进行强制转化。
//泛型类
class Cache{
static final Map _cached=Map();
///泛型方法
void setItem(String key,T value){
_cached[key]=value;
}
T getItem(String key){
return _cached[key];
}
}
//新建泛型Cache的使用
class TestGeneric{
void start(){
Cache cache1=Cache();
cache1.setItem('cache1', 'cache1');
String string1=cache1.getItem('cache1');
print(string1);
}
}
10.小彩蛋
1.善用?.防止空异常
print(list?.length);
2.善用??设置默认值
print(list?.length ?? 0);
3.简化判断
list = [];
list.add(0);
list.add('');
list.add(null);
//快速判断
if ([null, '', 0].contains(list[0])) {
print('list[0] is empty');
}
持续学习中。。。。