Dart语法基础
1.Dart中的数据类型
显示类型声明:
String str = 'hello world'; //每一句后面都必须要有分号
int num = 10;
double num2 = 1.2;
bool flag = false;
类型推断
var v = 100; //自动推断为int
var person = {'name': 'zs', 'age':20}; //自动推断为Map<String, dynamic>
字符串的常用操作:
var str = '123';
var str2 = 'hello';
var combine = str + '&' + str2; //123&hello
//换行
var str = '''
123
345
''';
//字符串插值
var s1 = 's1';
String s2 = 's2';
String s3 = 's3 $s1' //输出s3 s1
流程控制语句:和JS中的if-else,for,while一样使用即可
函数
普通函数定义
int sum(int a, int b){
return a+b; //返回int数据,和C语言类似
}
同理也有void函数,以及一些其它的函数。
可选参数
1)命名参数:
void printf({int? a, String? b, double? c, bool? d}){print('$a $b $c $d');}
//调用的时候
printf(a: 100, c: 1.2, d: true); //打印100 null 1.2 true
2)位置参数:
String greet(String name, [String title = '先生']){ //传递了就用传递的值,没传递就用默认值
return '你好$name$title';
}
Dart中的集合类
List(列表):实际上就是JS中的数组,有续集和,运行重复,索引从0开始
List<String> strArr = ['1', '2', 'a', 'b'];
strArr.add('3'); //在末尾添加一个元素
strArr.remove('1'); //删除值为字符1的元素
strArr.removeAt(1); //删除下标1的元素
strArr[3] = 'c'; //把下标3的元素的值赋为字符c
strArr.insert(1, '12345'); //在下标1处差如一个字符串'12345'
常用方法:
print(strArr.sublist(1, 3)); //获取子列表。就是截取下标1-3的元素作为一个子列表
print(strArr.indexOf('a'));//查找元素值为'a'的下标
strArr.sort();//列表排序
strArr.forEach(print);//遍历列表并打印每一项
for(var item in strArr){print(item)};//遍历列表并打印每一项
Set(集合)
元素唯一,无序,快速查找O(1)
var set1 = {1, 2, 3};
var emptySet = String{}; //空集,且集合中的每一项都必须是字符串
var colors = {'green', 'red'};
colors.add('blue');//添加元素
colors.remove('green');//删除元素
colors.addAll({'red', 'green'});//一次添加多个元素,重复元素自动过滤
// 集合运算
var primary = {'red', 'blue', 'yellow'};
print(colors.union(primary)); // 并集
print(colors.intersection(primary)); // 交集
print(colors.difference(primary)); // 差集
Map(映射,字典):类似于JS中的对象
键值对集合,键唯一,快速查找(基于键)
var pserson = {
'name':"zs",
'age':20
};
//或者
Map<string, dynamic> person = {'name':'lisi', 'age':18};
//或者
var person = Map<String, dynamic>();
常用方法:
person["name"] = "wangwu"; //只能通过[key]的形式获取map里面的值
person.remove('name'); //删除键为name的键值对
person.ForEach((k, v)=>print(’$k, $v‘));
for(var entry in person.entries){
print('$entry.key $entry.value');
}
集合的高阶操作
扩展运算符
var list1 = [1, 2];
var list2 = [3, …list1]; // [3, 1, 2]
var combined = […list1, …?list2]; // 空安全展开
列表的常用方法
var arr = [1, 2, 3, 4];
var double = arr.map((item)=>item * 2); //就是JS中的map
var evenNumbers = arr.where((n)=>n%2 == 0); //过滤,类似于JS中的filter
int sum = arr.fold(0, (prev, n)=>prev + n); //叠加器,就是JS中的reduce
集合转换
var listFromSet = Set.of([1, 2, 3]).toList();
var setFromList = List.from([1, 2, 3]).toSet();
var mapFromList = List.of(['1', '2', '3']).asMap(); // 转换后的结果就是:{0: '1', 1: '2', 2: '3'};
var entryList = person.entries.toList();
定时延时器
import 'dart:async';
void main(){
Timer(Duration(seconds: 3), (){print('3秒过去了!');});//延时定时器
int i = 0;
const timer = Timer.periodic(Duration(seconds: 3), (){
print(++i);
if(timer.tick == 5){ //5秒后关闭定时器
timer.cancle(); //关闭定时器,两种定时器都是通过这种方法关闭
}
}); //周期定时器
}
Future:类似于JS中的Promise
在dart中,Future用于处理异步操作的核心类,异步操作不会阻塞程序的执行流程,而future代表一个可能还未执行完的操作结果,当操作完成时会返回一个结果或者抛出一个错误。
使用:
Future<String> future(){
return Future<String>((completer){
//模拟一个耗时操作
Future.delayed(Duration(seconds: 3), (){
completer.complete('操作完成!!!');
});
});
}
这里使用 completer
来控制 Future
的完成状态,completer.complete
用于返回操作的结果。
Future.value与Future.error
通过Future.value返回一个已完成且指定值的Future,示例:
Future<int> futureWithValue = Future.value(2); //就相当于Promise中的resolve
通过Future.error返回一个已完成且带有错误的Future,示例:
Future<String> futureWithError = Future.error('error!!!'); //相当于Promise中的reject
处理Future的结果
Future的处理结果就和Promise的处理结果一样,可以用then和async/await来处理,语法都是一样的。
网络请求
在Flutter中使用网络请求的步骤如下:
1.配置网络请求
在pubspec.yaml的dependencies中配置:
dependencies:
http: ^1.0.0//去pubdev官网查找对应的版本
2.使用
导入网络请求库
import 'package:http/http.dart' as http;
void main async(){
const res = await http.get(Uri.pares('http://www.m.baidu.com/'));
if(res.statusCode == 200){
print('数据获取成功!!!${res.body}');
}else{
print('数据获取失败!!!${res.statusCode}');
}
}
面向对象
在Flutter中也有面向对象的概念,它运行你通过定义类和对象来组织代码。
1.类的定义:
class Person{
string? name; //默认是共有属性,在Flutter中声明私有属性不使用关键字private,而是直接在变量前面加一个下划线,即:string? _name; 就表示这是一个私有属性,外部不能直接访问。
int? age;
Person(thid.name, this.age); //构造函数的定义有多种,这种是最常用的
void introduce(){ //普通的成员方法
print('我叫$this.name, 今年$this.age岁');
}
}
抽象类
在Flutter中,没有接口的概念,与之对应的是抽象类,只定义属性和方法,不给属性赋值和方法的实现,可以被继承和实现。
flutter
abstract class Person{
String? name;
int? id;
int? age;
void introduce();
}
//继承
class Teacher extends Person{
String? _subject; //学科
Teacher(String name, int id, int age, this._subject){
this.name = name;
this.id = id;
this.age = age;
}
@override
void introduce(){
print('我是${name},一名${_subject}老师,教师号为:${id},今年${age}岁');
}
@override
String toString(){
return '我是${name},一名${_subject}老师,教师号为:${id},今年${age}岁';
}
}
//实现
class Student implements Person{
String? _college;
@override
int? age;
@override
int? id;
@override
String? name;
Student(this.name, this.age, this.id, this._college);
@override
void introduce() {
// TODO: implement introduce
print('我是${name},一名${_college}学生,学号为:${id},今年${age}岁');
}
}
//调用示例
import 'package:day3review/model/type.dart';
void main(){
Teacher stu = Teacher('teacher wang', 1, 26, 'math');
stu.introduce();
Student student = Student('lisi', 20, 1, 'tinghua');
student.introduce();
}
常用组件
Container,Text,TextFiled,TextButton,EleviatedButton,IconButton,SizeBox,ListView。
列表渲染:
1.最直接的方法
Column(
children: '1234567890'.split('').map((item)=>Text(item)).toList(),
)
叨叨几句... NOTHING