Dart语法与React Native 之间的异同汇总

参考张风捷特烈博客https://www.jianshu.com/p/7c826a5972ae

1.基础语法

(1)数字类型

​ dart中数据类型有三种:int num double ,都是dart中的类,是对象级别的,默认值都为null
​ rn中 数字类型为number

(2)布尔类型

​ dart中bool类型为 bool eg. bool isMan = true;

​ rn中为boolean ,一般使用动态类型var 或 let

​ java中基本数据类型为boolean,类为Boolean

(3)字符串类型

​ dart中字符串类型有三种,单引号.双引号和三引号, 需要注意的是单引号中的单引号需要转义,三引号中的字符内容会原样输出。

	var s = "字符串类型双引号";
  var p = '字符串类型单引号';
  var c = """//三引号\n</br>""";
  print('${s}\n$p\n'+ c);
-----------输出----------
	字符串类型双引号
	字符串类型单引号
  三引号
	</br>	
(4)Runes

​ 这是dart中的新名词,他是一个类,继承至Iterable,dart字符串编码为UTF-16,这个就是用于查看utf-16的编码

	String dart ="Dart语言";
  print(dart.codeUnits);//[68, 97, 114, 116, 35821, 35328]
  print(dart.runes);//(68, 97, 114, 116, 35821, 35328)
  
  var evil = '\u{1f47f}';
  print(evil);//👿
  print(evil.codeUnits);//[55357, 56447]
  print(evil.runes);//(128127)

看一个恶魔的emoji 👿,对应的Unicode为\u{1f47f},看一下他的UTF-16码

2.变量和常量

(1) var 关键字:

​ dart中如果只是用var声明变量,该变量之后是可以修改数据类型的.未赋值时,var声明的变量类型为dynamic(动态的)

var who;
who="what";
print(who is String);//true
who=10;
print(who is int);//true

​ 如果声明的同时取赋值,那么该对象的类型就是固定的,不可修改

var who="what";
print(who is String);//true
who=10;//此处报错
print(who is int);//true

rn中声明变量未赋值时, 类型为undefined,没有dart的限制,可以随意修改
debug信息

3.算术运算符

(1)四则运算
print(10 ~/ 3);//3  商
(2) 条件表达式

​ ??运算符:前表达式值未null时取后者,否则,后表达式不会被执行

dart---->[情况1:b值为null]----
var a = 20;
var b;
var c=b ?? a++;
print('a=$a,c=$c');//a=21,c=20

---->[情况1:b值为null]----
var a = 20;
var b = 2;
var c = b ?? a++;
print('a=$a,c=$c'); //a=20,c=2

​ 与rn中||表达式类似

var a= 20;
var b;
var c= b || a++;
console.log(`a = ${a};c = ${c}`)//a = 21;c = 20

4.Dart中的函数

(1) dart与RN类似,都是可以将函数作为一个参数传入,函数本身也是一个对象,RN则是组合函数,写法有所区别
 double add(double a,double b,deal){
  return deal(a)+deal(b);
}

// 调用:
var fun = (double i) {
  return i * i;
};
print(add(3, 4, fun));//求两数的平方和 25
function add(a, b) {
    return a + b;
}
function square(a) {
    return a * a;
}
function compose(fn1, fn2) {
    return (...args) => fn1(fn2(...args));
}
console.log(compose(square, add)(1, 2));//9

5.其他

(1)级联操作符…
---->[情景1:曾经的写法]----
var paint = Paint();
paint.strokeCap = StrokeCap.round;
paint.style = PaintingStyle.stroke; //画线条
paint.color = Color(0xffBBC3C5); //画笔颜色
paint.isAntiAlias = true; //抗锯齿
paint.filterQuality =  FilterQuality.high; //抗锯齿

---->[情景2:级联的写法]----
paint
  ..strokeCap = StrokeCap.round
  ..style = PaintingStyle.stroke //画线条
  ..color = Color(0xffBBC3C5) //画笔颜色
  ..isAntiAlias = true //抗锯齿
  ..filterQuality = FilterQuality.high;
(2)条件调用符 ?.
---->[情景1:普通调用]----
void main() {
  var a = -5;
  print(a.abs());//5
}

---->[情景2:普通调用前置空,会崩掉]----
var a = 5;
a=null;
print(a.abs());//NoSuchMethodError: The method 'abs' was called on null.

---->[情景3:?.调用不会崩掉,只返回null]----
var a = 5;
a = null;
print(a?.abs()); //null
(3) 类型判断关键字、isis!as
var b=10;
print(b is String);//false
print(b is num);//true
print(b is! double);//true

String c="12315";
print((c as Comparable<String>).compareTo("a"));//-1  强制类型转换
print((c as num).abs());//类型转换异常
// type 'String' is not a subtype of type 'num' in type cast

6.包访问

(1)库的使用和可见性
<1>库的基本使用
import 'dart:math';//导入math内置库
import 'package:flutter/material.dart';//根据文件系统路径到包
<2>类库中的命名冲突: as 关键字的使用

​ 当sin函数处于连个包中,并且两个包都被导入,该怎么办

---->[utils/color_utils.dart]----
sin(double d){

}

---->[main.dart:5]----
import 'package:toly/utils/color_utils.dart';
import 'dart:math';
void main() {
  sin(5);
}

---->[解决方案]----
import 'package:toly/utils/color_utils.dart' as myMath;
import 'dart:math';

void main() {
  myMath.sin(5);
}
<3>权限访问控制

​ 需要注意的是,Dart中没有private,public,protected修饰符。如何做到访问权限控制,是个问题,默认是 可以被访问的。Dart中规定,名称前加下划线可以限制外部的访问,如下_age。方法名,文件名也是如此,不 想对外暴露,前面加下划线即可

---->[painter/person.dart]----
class Person{
  String name;
  int _age;
  Person(this.name,this._age);

  say(){
    print("my name is $name and i am $_age years old.");
  }
}

---->[main.dart]----
void main() {
  var toly = Person("toly", 25);
  toly.say();//my name is toly and i am 25 years old.
  print(toly._age);//报错

}
<4>libraryexport关键字的使用

​ 这里拿animation来举例子,使用时导包:import 'package:flutter/animation.dart';在源码中 animation.dart只做了一个归纳暴露的动作。

library animation;

export 'src/animation/animation.dart';
export 'src/animation/animation_controller.dart';
export 'src/animation/animations.dart';
export 'src/animation/curves.dart';
export 'src/animation/listener_helpers.dart';
export 'src/animation/tween.dart';
export 'src/animation/tween_sequence.dart';

7.泛型 与java非常类似,不做过多的描述

8.异步操作

(1)asyncawait关键字的使用

​ 异步操作中返回的是Future对象,RN中返回Promise对象

//-----dart-----
Future<Water> heat(Water water) async{//异步烧水
  return await water.changeTemperature(100);//返回烧开的水的Future
}

main(){
  print("打开烧水开关");
  heat(Water(0)).then((result){
    print('水已经烧开,现在温度:${result.temperature},开始冲水');
  });
  print("扫地");
}

9.dart中的多继承

(1)单继承与java一样,先调用父类构造方法
class Living {
  Living(){
    print("Runner");
  }
}

class Person extends Living{
  Person(){
    print("Person");
  }
}

main(){
  Person toly = Person();
}

---->[打印结果]----
Runner
Person
(2).mixin

首先mixin是一个定义类的关键字。直译出来是混入,混合的意思
Dart为了支持多重继承,引入了mixin关键字,它最大的特殊处在于:
mixin定义的类不能有构造方法,这样可以避免继承多个类而产生的父类构造方法冲突

class Living {
  Living(){
    print("Runner");
  }
}

class Runner {

  run(){
    print("run");
  }
}

class Walker{
  walk(){
    print("run");
  }
}

class Person extends Living with Walker,Runner{
  Person(){
    print("Person");
  }
}

main(){
  Person toly = Person();
  toly.run();
  toly.walk();
}
关于mixin关键字

使用class关键字定义的类是可以当做mixin类使用的,比如上面的。
另外使用mixin关键字也可以来定义mixin类,如:

mixin Walker{
  walk(){
    print("run");
  }
}

唯一的区别在于,你是否确定它是一个mixin类。
当你在mixin声明的类中定义构造方法,会直接报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值