Dart语言基础(flutter必学)
开发环境配置1.安装dart sdk中文地址:https://dart.cn/get-dartwindows如果是免安装包需要将sdk的bin目录添加到用户变量PATH中2.vscode开发工具配置安装Dart Cod和Code Runnere插件新建一个目录并创建xxx.dart文件即可开始Hello World!1.基础-变量-类型void main(List<String> ar
·
开发环境配置
1.安装dart sdk
中文地址:https://dart.cn/get-dart
windows如果是免安装包需要将sdk的bin目录添加到用户变量PATH中
2.vscode开发工具配置
安装Dart Cod和Code Runnere插件
新建一个目录并创建xxx.dart文件即可开始Hello World!
1.基础-变量-类型
void main(List<String> args) {
// 注释
///注释
/**注释 */
// 用类型定义变量的话,在该变量被赋值之前使用会报错The non-nullable local variable 'abc' must be assigned before it can be used.
final只能赋值一次,const 声明即必须赋值
当const用在=右边,其作用是 修饰值,它意味着对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并且完全不可变。
当const用在=左边时,其作用是 声明变量,它要求 必须在声明变量时赋值,一旦赋值就不允许修改,而声明值一定要是编译时常数。
在flutter开发中能使用const尽量使用const声明为单例提升性能
常量构造函数总结如下几点:
1. 常量构造函数需以const关键字修饰
2. const构造函数必须用于成员变量都是final的类,并且必须有初始化值
3. 构建常量实例必须使用定义的常量构造函数
4. 如果实例化时不加const修饰符,即使调用的是常量构造函数,实例化的对象也不是常量实例
String str = '123';
String str2 = '''
123
456
''';
String re = '$str---$str2'+'999';
print(re);
int nu = 123;
bool isFalse = str == nu;
print(isFalse);
List list1 = ['str', 123];
List list2 = <int>[1, 2];
list2.add(3);
print(list2.length);//3
List list3 = List.filled(2, 0); //List.filled创建的只能存储单一类型,此处等同于List<int>.filled(2, 0)
// list3.add(3); //报错Cannot add to a fixed-length list
print(list3);
List list4 = List.filled(2, 0, growable: true);
list4.add(3); //正常添加
print(list4);
var list5 = [1,2,3,4];
list5.length = 3;
print(list5);//[1, 2, 3]
var map = {
'key': 888
};
print(map['key']);
var map2 = new Map();
map2['key'] = 888;
print(map2['key']);
// 类型判断
bool b1 = '123' is String;
bool b2 = 123 is int;
print(b1);
print(b2);
/**
* 暂不研究的类型
* Runes;
* Symbol;
*/
}
2.运算-类型转换-函数参数
void main(List<String> args) {
/**
* 运算符= + - * / % || && ++ --等和js一样,提供了??(空判断) ??= ~/(取商) ~/=
* 三目 switch等也与js一样
*/
var aa;
aa ??= 1;
print(aa); //1
// 类型转换
String str = '123';
print(int.parse(str) == 123);
String str1 = '123.00';
print(double.parse(str1));
String str2 = ''; //为空时parse报错
double result = 0;
// 解决1
try {
result = double.parse(str2);
} catch (e) {}
// 解决2
if(str2.isNotEmpty) result = double.parse(str2);
print(result); //0
int nu = 123;
print(nu.toString() == '123');
print(''.isEmpty); //true
var abc;
print(abc == null); //true
double ss = 1 / 0;
print(ss.isInfinite); //true
var ww = 0 / 0;
print(ww.isNaN); //true
// 方法可选参数
String getNameStr(String name, [int? age, String? sex]) {
return '$name-$age-$sex';
}
String nameStr = getNameStr('lucklin', 18);
print(nameStr);//lucklin-18-null
// 方法默认参数(默认参数属于可选参数)
String getNameStr2(String name, [int? age, String sex = '未知']) {
return '$name-$age-$sex';
}
String nameStr2 = getNameStr2('lucklin', 18);
print(nameStr2);//lucklin-18-未知
// 命名参数(无序)
String getNameStr3(String name, {int? age, String sex = '未知'}) {
return '$name-$age-$sex';
}
String nameStr3 = getNameStr3('lucklin', sex:'男', age:18);
print(nameStr3);//lucklin-18-'男'
//传递函数
String test(Function fn) {
return fn();
}
print(test(()=> 'this is args fn'));
}
3.list-set-map常用属性和方法
void main(List<String> args) {
List list = ['1', '2', '3'];
print(list.isEmpty);//false
print(list.isNotEmpty);//true
print(list.reversed);//(3, 2, 1)
print(list.reversed.toList());//[3, 2, 1]
List list2 = ['1', '2', '3'];
list2.addAll(['4', '5']);
print(list2);//[1, 2, 3, 4, 5]
print(list2.indexOf('5'));//4
print(list2.removeAt(4));//5
list2.remove('1');
print(list2);//[2, 3, 4]
List list3 = ['1', '2', '3'];
list3.insert(0, '0');
print(list3);//[0, 1, 2, 3]
list3.insertAll(0, ['-2', '-1']);
print(list3);//[-2, -1, 0, 1, 2, 3]
print(list3.join());//-2-10123
// list2.fillRange(start, end, value);//包含开始不包含结束下标位置替换为value
Set set = new Set();
set.add('1');
set.add('1');
set.addAll(['1']);
print(set);//{1}
print(set.toList());//[1]
print(['1', '1'].toSet());//{1}
Map map = <String, String>{
'name': 'lucklin',
'age': '18'
};
print(map.keys.toList());//[name, age]
print(map.values.toList());//[lucklin, 18]
print(map.isEmpty);//false
map.addAll(<String, String>{
'sex': '男'
});
print(map);//{name: lucklin, age: 18, sex: 男}
map.remove('sex');
print(map);//{name: lucklin, age: 18}
print(map.containsKey('age'));//true
print(map.containsValue('18'));//true
// 遍历相关方法(map/forEach通用)
list3.forEach((e) => print(e));
print(list3.map((e) => e*3));//(-2-2-2, -1-1-1, 000, 111, 222, 333)
print(list3.where((e) => e == '0'));//(0) 等同js filter()
print(list3.any((e) => e == '0'));//true 等同js some()
print(list3.every((e) => e is String));//true 等同js every()
}
4.封装继承多态-泛型
class Animal<T> {
T catgory;
Animal(T this.catgory);
void run() {
print('$catgory---run...');
}
}
class Dog<T> extends Animal<T> {
Dog(T catgory) : super(catgory);
}
//abstract既可以作为抽象类也可以作为接口
abstract class A {
late String catgory;
void run();
void publicFn();
}
//将A作为抽象类继承
class B extends A {
@override
void publicFn() {
// TODO: implement publicFn
}
@override
void run() {
// TODO: implement run
}
}
//将A作为接口实现(必须重写所有)
class C implements A {
@override
late String catgory;
@override
void publicFn() {
// TODO: implement publicFn
}
@override
void run() {
// TODO: implement run
}
}
//cdart中也是单继承多实现,但是供提了mixins来实现多继承(mxins类不能写构造方法)
class Cat {
}
class D with A, Cat {
@override
void publicFn() {
// TODO: implement publicFn
}
@override
void run() {
// TODO: implement run
}
}
void main(List<String> args) {
Animal dog = new Dog<String>('狗');
dog.run();//狗---run...
print(dog is Dog);//true
print(dog is Animal);//true
print(dog is Object);//true
}
更多推荐
已为社区贡献1条内容
所有评论(0)