当前位置:网站首页 / flutter / 正文

ay开发flutter3程序学习笔记 2 - dart官网学 - 基础

时间:2023年04月07日 | 作者 : aaronyang | 分类 : flutter | 浏览: 960次 | 评论 0

如果仅仅学习dart,不想装环境,直接web学,我自己还是用vscode

DartPad - 由郑州玩码科技有限公司维护


学习地址:Language tour | Dart

支持泛型,空安全,class类,C#有的特性基本都有

Dart 没有类似于 Java 那样的 public、protected 和 private 成员访问限定符。如果一个标识符以下划线 (_) 开头则表示该标识符在库内是私有的。可以查阅 库和可见性 获取更多相关信息

String支持单引号,类似js中的字符串,C#必须是双引号,不是就是char类型了


可空整型数字

    int? lineCount;

    assert(lineCount == null);


如果你确定这个变量在使用前就已经被声明,但 Dart 判断失误的话,你可以在声明变量的时候使用 late 修饰来解决这个问题。

late String description;

void main() {
  description = 'Feijoada!';
  print(description);
}

在下面这个例子中,如果 temperature 变量从未被使用的话,那么 readThermometer() 将永远不会被调用:

late String temperature = readThermometer(); // Lazily initialized.


image.png

image.png

dart:math库 数学库,比如ceil, abs,floor


颜色值

var hex = 0xDEADBEEF;


image.png


字符串插值

image.png

多行拼接

image.png

image.png

image.png

image.png

集合

var list = [1, 2, 3];

var list = [

  'Car',

  'Boat',

  'Plane',

];

main() {
  var list = [1, 2, 3];
  assert(list.length == 3);
  print('ok');
}

Dart 在 2.3 引入了 扩展操作符(...)和 空感知扩展操作符(...?),它们提供了一种将多个元素插入集合的简洁方法。

例如,你可以使用扩展操作符(...)将一个 List 中的所有元素插入到另一个 List 中:

var list = [1, 2, 3];

var list2 = [0, ...list];

assert(list2.length == 4);

如果扩展操作符右边可能为 null ,你可以使用 null-aware 扩展操作符(...?)来避免产生异常

var list2 = [0, ...?list];

assert(list2.length == 1);


image.png

  listOfInts.forEach((element) {
    print(element);
  });

Set类型,花括号 包裹了

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

创建一个空的set

var names = <String>{};

// Set<String> names = {}; // This works, too.

// var names = {}; // Creates a map, not a set.   是 Map<dynamic, dynamic>类型


添加单个和多个

var elements = <String>{};

elements.add('fluorine');

elements.addAll(halogens);

这个时候已经你以为有6个元素,但是set会自动去重,所以length==5

image.png

Map类似C#的dictionary<T,V>

image.png

image.png

dart中不建议使用new这个关键字

判断key是否存在,

image.png

image.png



Runes 与 grapheme clusters

Unicode 编码为每一个字母、数字和符号都定义了一个唯一的数值。因为 Dart 中的字符串是一个 UTF-16 的字符序列,所以如果想要表示 32 位的 Unicode 数值则需要一种特殊的语法

表示 Unicode 字符的常见方式是使用 \uXXXX,其中 XXXX 是一个四位数的 16 进制数字。例如心形字符(♥)的 Unicode 为 \u2665。对于不是四位数的 16 进制数字,需要使用大括号将其括起来。例如大笑的 emoji 表情(?)的 Unicode 为 \u{1f600}

import 'package:characters/characters.dart';


void main() {

  var hi = 'Hi ??';

  print(hi);

  print('The end of the string: ${hi.substring(hi.length - 1)}');

  print('The last character: ${hi.characters.last}');

}

image.png



Symbols类似C#的 #region 等预编译符

image.png


函数

isNoble(atomicNumber) {

  return _nobleGases[atomicNumber] != null;

}

可以不写返回类型,还可以如下类似C#的匿名方法,简写 

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;


可选命名,指定参数名字传入参数,用花括号{ },调用类似C#的默认参数传参

image.png



还有个可选位置,类似最后几个位置的参数,类似实现C#的方法重载

image.png


main方法,类似C#的控制台等程序入口

image.png

image.png


简写下main代码

void main() {
  const list = ['apples', 'bananas', 'oranges'];
  list.map((item) {
    return item.toUpperCase();
  }).forEach((item) {
    print('$item: ${item.length}');
  });
}
list
    .map((item) => item.toUpperCase())
    .forEach((item) => print('$item: ${item.length}'));


闭包 

即一个函数对象,即使函数对象的调用在它原始作用域之外,依然能够访问在它词法作用域内的变量。

image.png

通过闭包,创建了一个动态的函数


C#中方法可以定义为委托类型,Dart中是Function类型


image.png



运算符这块基本通用

dart中有个 ..  和 ?..  左运算符

image.png

有个运算 ~/除并取整

image.png

关于is,as,还有个is!


image.png

是null就等于右侧的值




image.png

双问号, name为null,返回Guest



下面讲个C#没有的级联运算符,dart的特殊语法

image.png

第一行后面没有 分号了,然后换行,使用双点号, 等同于 paint.Color 这种简写

image.png

当变量不是null时候,才执行级联后面的操作,等同于下面的代码

image.png

还可以嵌套

image.png

 image.png

  var message = StringBuffer('Dart is fun');
  for (var i = 0; i < 5; i++) {
    message.write('!');
  }


在 Dart 语言中,for 循环中的闭包会自动捕获循环的 索引值 以避免 JavaScript 中一些常见的陷阱。假设有如下代码:

image.png


类似C#的foreach  可迭代集合 | Dart

for (final candidate in candidates) {

  candidate.interview();

}

  const iterable = ['Salad', 'Popcorn', 'Toast'];

  for (final element in iterable) {

    print(element);

  }

 print('The first element is ${iterable.first}');

  print('The last element is ${iterable.last}');

返回符合条件的一批数据的第一个firstWhere

String element = iterable.firstWhere((element) => element.length > 5);

没有符合的orElse返回默认

  var foundItem4 = items.firstWhere(

    (item) => item.length > 10,

    orElse: () => 'None!',

  );


image.png

类似C#的Any()和All()

除了firstWhere(),singleWhere()

但是,如果您想找到所有元素怎么办 满足某个条件? 您可以使用该方法完成此操作。where()

我们C#都用 结果.Count()判断有值,dart用isEmpty

  var largeNumbers = evenNumbers.where((number) => number > 1000);

  if (largeNumbers.isEmpty) {

    print('largeNumbers is empty!');

  }


takeWhile和skipWhere类似C#的LINQ中的Take和Skip,但是这里不是,

dart中感觉,从左往右,take开始取值,当遇到满足条件时候,就停止取值了。skipWhile是相反的,遇到符合条件的就开始取值。

image.png

映射,就是map关键字,下面代码是将每个数字都乘以10,有点类似C#的LINQ的 SelectMany

Iterable<int> output = numbers.map((number) => number * 10);



循环语句和if,switch和 .net4.5以前的C#一致,不过dart的case还多了

image.png


抛出异常 throw

void distanceTo(Point other) => throw UnimplementedError();

throw 'AY www.ayjs.net';

throw FormatException('Expected at least 1 section');


捕获异常

如上述代码所示可以使用 on 或 catch 来捕获异常,使用 on 来指定异常类型,使用 catch 来捕获异常对象,两者可同时使用。

try {

  breedMoreLlamas();

} on OutOfLlamasException {

  // A specific exception

  buyMoreLlamas();

} on Exception catch (e) {

  // Anything else that is an exception

  print('Unknown exception: $e');

} catch (e) {

  // No specified type, handles all

  print('Something really unknown: $e');

}

你可以为 catch 方法指定两个参数,第一个参数为抛出的异常对象,第二个参数为栈信息 StackTrace 对象:

image.png

关键字 rethrow 可以将捕获的异常再次抛出

image.png

无论是否抛出异常,finally 语句始终执行,如果没有指定 catch 语句来捕获异常,则异常会在执行完 finally 语句后抛出,和C#一致。










推荐您阅读更多有关于“flutter,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音:wpfui 工作wpf,兴趣学习flutter

目前在合肥市某公司上班,已经厌弃,如果你的公司看的上我,加我QQ私聊

AYUI8全源码 Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始学习WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

标签列表