前言
如果做一个App,使用原生技术,公司需要安卓团队、ios团队,随着鸿蒙的崛起还需要有鸿蒙团队,需要编写不同端的代码,要写多套。小公司难以承担这么多人的成本。那么有没有一套代码实现多端的技术呢?跨平台技术呼之而出,Flutter、KMP、React、Uniapp、Taro等跨平台技术随之涌现,目前生态、性能最好的仍要属Flutter。在开源鸿蒙训练营很多跨平台框架,我对Flutter比较感兴趣。因为没学过Flutter,想学习一下,基础类型、运算符、循环结构等都和java什么的差不多。这里只记录自己没什么印象的,故写此篇笔记。如果大家想看基础知识,可以看这位博主的文章,写的很详细。
Tips
vscode设置注释颜色,默认的注释看久了,眼睛看的很难受,伤眼,所以我们需要在"setting.json"更改设置

找到settinng.json,在最后添加这一段代码
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": "comment",
"settings": {
"foreground": "#98C379"
}
}
]
}

一、网络操作
1.同步操作会阻塞程序运行
Dart
//异步编程
//内容
//1.同步会阻塞程序运行
//2.使用Future异步处理
//3.Future链式调用
//4.使用 async await
import 'dart:io';
void main() {
print('main 开始');
//执行耗时操作
String data = getNetWorkData();
print(data);
print('main 结束');
}
//1.同步执行会阻塞
String getNetWorkData() {
sleep(Duration(seconds: 3));
return '网络数据';
}
2.使用Future异步处理,结果是异步执行的
Dart
//2.使用Future异步处理
import 'dart:io';
void main() {
print('main 开始');
//执行耗时操作
// String data = getNetWorkData();
// print(data);
print('main 结束');
getNetWorkData().then((result) {
print(result);
});
}
//2.使用Future异步处理
getNetWorkData() {
return Future(() {
// 去进行耗时操作
sleep(Duration(seconds: 3));
return '网络数据';
});
}

3.Future链式调用(通过回调then,通过回调函数的方式拿执行之后的结果,如果你的结果依赖于上一个结果,那么他们就会产生嵌套)
Dart
//异步编程
//内容
//1.同步会阻塞程序运行
//2.使用Future异步处理
//3.Future链式调用
//4.使用 async await
import 'dart:io';
void main() {
print('main 开始');
//执行耗时操作
// String data = getNetWorkData();
// print(data);
//2. 通过异步执行
// getNetWorkData().then(result){
// print(result);
// }
//3.链式调用 异常处理
getNetWorkData().then((result) {
print(result);
}).catchError((e) {
print('错误的原因:$e');
});
print('main 结束');
}
//1.同步执行会阻塞
// String getNetWorkData() {
// sleep(Duration(seconds: 3));
// return '网络数据';
// }
//2.使用Future异步处理
// getNetWorkData() {
// return Future(() {
// // 去进行耗时操作
// sleep(Duration(seconds: 3));
// return '网络数据';
// throw Exception('网络异常')
// });
// }
//3.链式调用 异常处理
getNetWorkData() {
return Future(() {
//去进行耗时操作
sleep(Duration(seconds: 3));
throw Exception('网络异常');
});
}

4.使用 async await
Dart
//异步编程
//4.使用 async await
import 'dart:io';
void main() {
print('main 开始');
// 4. async await 使用 通过then拿结果
login().then((token) {
print(token);
getUserInfo().then((userInfo) {
print(userInfo);
});
});
print('main 结束');
}
// 4.使用async await 优化异步操作
// 两个接口(登录之后拿着token去拿用户信息)场景:登录后,拿到用户信息
login() {
return Future(() {
sleep(Duration(seconds: 2));
return 'token-10086';
});
}
// 拿用户信息
getUserInfo() {
return Future(() {
sleep(Duration(seconds: 3));
return 'Jack 18';
});
}
doLogin() async {
String token = await login();
print(token);
String userInfo = await getUserInfo();
print(userInfo);
}

二、泛型
Future的时候,很多情况都是 dynamic 动态类型。(数组里面的值不确定,比如有String类型、有int类型)
如果不指定泛型,里面可以是任意类型。当指定泛型,就只能使用指定的类型
Dart
void main() {
List list = [1, 2, 3,'100'];
}


1.List的泛型
Dart
void main() {
//1.List的泛型
List<int> list = [1, 2, 3, 100];
List<String> categories = ['服饰', '电脑'];
}
2.Map的泛型
Dart
//2.Map的泛型
// Map user = {
// 'name':'Jack',
// 'age':100
// };
//<>约束键值对的类型。第一个代表Key的类型,第二个代表Value的类型
Map<String, String> goods = {
'name':'电脑',
'price':'100'
};
3.函数的泛型
需求:函数传入什么类型的数据返回什么类型的数据
Dart
// String getString(String params) {
// return params;
// }
// double getNum(double params) {
// return params;
// }
但是上面这个写法不好。所以我们使用函数的泛型写法
Dart
//3.函数泛型。(目的:为了我们的封装更加彻底)
String str = getData<String>('jack');
double num = getData<double>(10);
T getData<T>(T params) {
return params;
}
4.future的泛型
Dart
// 4.Future的泛型
login().then((result) {
print(result);
});
}
Future<String> login() {
return Future<String>(() {
sleep(Duration(seconds: 2));
return 'token-10086';
});
}
三、异常处理
1.处理异常
Dart
void main() {
//dynamic能少用就少用
try {
dynamic name = 'jack';
name.haha();
print(name.length);
} catch (e) {
print('处理异常$e');
}
}

2.await异常处理
Dart
import 'dart:io';
void main() {
doLogin();
}
//2.await异常处理
doLogin() async {
await getNetWorkData();
}
getNetWorkData() {
return Future(() {
//去进行耗时操作
sleep(Duration(seconds: 3));
// return '网络数据'
throw Exception('网络异常');
});
}

此时还需要try-catch进行异常捕获
Dart
import 'dart:io';
void main() {
doLogin();
}
//2.await异常处理
doLogin() async {
try {
await getNetWorkData();
} catch (e) {
print('错误 $e');
}
}
getNetWorkData() {
return Future(() {
//去进行耗时操作
sleep(Duration(seconds: 3));
// return '网络数据'
throw Exception('网络异常');
});
}
本次文章到此结束,如果对你有帮助,请给我点个赞吧~