开源鸿蒙-Flutter基础-dart学习-1

前言

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

学习Dart语言,看这一篇文章就够了!(详细介绍)-CSDN博客https://blog.csdn.net/weixin_42433094/article/details/109216935?ops_request_misc=elastic_search_misc&request_id=9a06cb1adfd76178351406f8a8d4d2ee&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-109216935-null-null.142^v102^pc_search_result_base5&utm_term=dart&spm=1018.2226.3001.4187

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('网络异常');
  });
}

本次文章到此结束,如果对你有帮助,请给我点个赞吧~

相关推荐
浅念-2 小时前
C++入门(2)
开发语言·c++·经验分享·笔记·学习
ZH15455891312 小时前
Flutter for OpenHarmony Python学习助手实战:面向对象编程实战的实现
python·学习·flutter
简佐义的博客2 小时前
生信入门进阶指南:学习顶级实验室多组学整合方案,构建肾脏细胞空间分子图谱
人工智能·学习
近津薪荼2 小时前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
晚霞的不甘2 小时前
CANN × ROS 2:为智能机器人打造实时 AI 推理底座
人工智能·神经网络·架构·机器人·开源
rannn_1112 小时前
【苍穹外卖|Day4】套餐页面开发(新增套餐、分页查询、删除套餐、修改套餐、起售停售)
java·spring boot·后端·学习
renke33642 小时前
Flutter for OpenHarmony:构建一个 Flutter 色彩调和师游戏,RGB 空间探索、感知色差计算与视觉认知训练的工程实现
flutter·游戏
王码码20353 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
张人玉3 小时前
VisionPro 定位与卡尺测量学习笔记
笔记·学习·计算机视觉·vsionprp
芷栀夏3 小时前
从 CANN 开源项目看现代爬虫架构的演进:轻量、智能与统一
人工智能·爬虫·架构·开源·cann