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

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

相关推荐
嘴贱欠吻!1 小时前
开源鸿蒙-基于React搭建GitCode口袋工具-3
开源·gitcode
kirk_wang1 小时前
Flutter三方库鸿蒙适配深度解析:从架构原理到性能优化实践
flutter·移动开发·跨平台·arkts·鸿蒙
老青蛙1 小时前
Easy Work-简单、易用、傻瓜式的 Java 流程引擎
java·开源
隐语SecretFlow1 小时前
【隐语Secretflow】如何在Docker多机部署Kuscia点对点集群
开源·资讯
周杰伦_Jay1 小时前
【免费云平台部署指南】按场景选型+全维度对比(附直达地址)
网络·人工智能·架构·开源·云计算
Genevieve_xiao1 小时前
【数据结构】【xjtuse】面向考纲学习(上)
数据结构·学习
crary,记忆1 小时前
PNPM 和 NPM
前端·学习·npm·node.js
Ya-Jun1 小时前
架构设计模式:MVVM架构应用
flutter·架构