Dart基础(一)

级别: ★☆☆☆☆
标签:「Flutter 」「Dart」「Dart基础类型」
作者: WYW
审校: QiShare团队


前言:
4篇Dart基础已经全部更新完成。目录如下:
Dart 基础 (一)
Dart 基础 (二)
Dart 基础 (三)
Dart 基础 (四)


笔者最近看了Flutter相关的内容,而Flutter的基础库是由Dart编写的,所以笔者学习了关于Dart的部分内容,整理了几篇关于Dart基础的文章。

Flutter 、Dart简介

Flutter is Google’s portable UI toolkit for building beautiful, natively-compiled applications for mobile, web, and desktopfrom a single codebase. (引自Flutter.dev
Flutter 是谷歌的便携式UI工具包,可以使用一套代码库,来创建漂亮的本地编译的移动端(iOS、Android)应用,web(浏览器中的页面)、桌面(Mac、Windows、Linux)应用。
Flutter 当前最新稳定版本是1.5。

Dart([KK] 英语发音:/dɑrt/, [DJ] 英语发音:/dɑ:t/)是一种适用于万维网的开放源代码编程语言,由Google主导开发,于2011年10月公开。它的开发团队由Google Chrome浏览器V8引擎团队的领导者拉尔斯·巴克主持,目标在于成为下一代结构化Web开发语言。
类似JavaScript,Dart也是一种面向对象语言,但是它采用基于类编程。它只允许单一继承,语法风格接近C语言。

Dart is a client-optimized language for fast apps on any platform
Dart是客户端的优化过的语言,可用于在任何平台(包括移动端(iOS、Android)、Web页面、桌面(Mac、Windows、Linux)应用),来创建运行流畅的应用。

当前Dart最新版本是2.4.0,2019-06-27 Dart开发团队发布2.4.0版本Dart。 Dart change log

下边,我们聊一下,关于Dart安装,及查看代码运行效果的内容

安装Dart

Dart 安装方式可查看:http://dart.goodev.org/install
在 Mac 安装 Dart 可查看 : http://dart.goodev.org/install/mac

在线演示Dart运行效果

DartPad:Dart 在线演示:https://dartpad.dartlang.org

DartPad, an open-source tool, allows you to play with the Dart language features in any modern browser.

DartPad 是一个开源工具,我们可以在现代浏览器中使用DartPad来演示Dart语言特性。
笔者的理解就是,我们可以用DartPad在线查看Dart编程效果。

下边我们聊一下,Dart的基础语法相关的内容。

Dart导入头文件(资源库)的方式

// dart:io 为非Web应用提供文件,Socket,HTTP,和其他IO支持。
import 'dart:io';

// 导入Android设计风格的material库
import 'package:flutter/material.dart';

// 导入iOS 的设计风格cupertino库
import 'package:flutter/cupertino.dart';

// 只导入material库中的AppBar
import 'package:flutter/material.dart' show AppBar;

// 导入除了material库中 除BottomNavigationBar之外 的内容
import 'package:flutter/material.dart' hide BottomNavigationBar;

Dart基本语法

  • 1. 输出语句
    一般我们开始学习某门语言的时候都会先输出,Hello World!或者是Hello 语言名。
    Dart的输出语句和Swift一样,都是print。Dart的语句需要使用分号结尾。
main(){
  print('Hello World!');
  print('Hello Dart!');
}


// 输出结果:
/**

Hello World!
Hello Dart!

*/

  • 2. 变量

定义变量使用 关键字var;
如定义变量名为name,值为QiShare的变量。

  var name = 'QiShare';
  print(name);

// 输出结果:
//  QiShare

Dart变量默认值为null

  int fansCount;
  //   String fansCount;
  if (fansCount == null) {
    print('null');
  } else {
    print('not null fansCount ${fansCount}');
  }

// 输出结果:
  /**
  null
  */
  

输出变量,需要拼接字符串和变量一起输出的情况下,所有的内容都使用''包起来

${变量} 可以用于访问相应的变量的值。

取变量值是否使用{} 分情况:

  • 1.直接访问实例的情况 直接使用 $实例 即可;

  • 2.访问实例的成员变量的情况 需要使用 ${实例.变量} ;

  • 3.只是单纯输出实例或者是实例的成员变量的情况,不需要使用$。

  • 3. 字符串
    字符串拼接及多行字符串

    // 字符串拼接
    var name = 'QiShare' + 'QiShare';
    print(name);
  
    // 输出结果:
    // QiShareQiShare
  
    // 多行字符串
    var name = '''
    QiShare
    QiShare
    QiShare
  ''';
  print(name);
  
  // 输出结果:
  /**
  QiShare
  QiShare
  QiShare
  */
  

关于变量是否对外可访问,在iOS Objective-C里边,如果我们想类文件A的某个变量对外可见,可以在类A.h文件里边把变量声明为属性。然后只要引用了A.h的类,就能够访问A.h中声明的属性。

在Dart中,如果要指定某个变量对外可访问,可以在类文件的顶部声明变量。

  • 如果想要指定某个类的实例变量对外可访问,直接写在类声明的内部即可。并且变量不要使用下划线开头。

  • 对于私有的变量,或者方法,使用下划线 “_” 在变量、方法前,则该变量、方法将分别为私有变量、私有方法。

  • 对于其他的多个常量,整个项目中使用的情况,可以单独创建一个类文件用于存放公共的常量。

  • 4. 变量类型检查及值检查

开发过程中,在对服务端下发的数据,进行处理的时候,有时需要进行变量类型判断,值的检测。可以参考如下的2种检测方式。

一个是变量类型检查,使用runtimeType或者使用关键字is进行类型检测;
另一个是变量的值的检查

变量类型检查

  // runtimeType是用于查看变量类型的。
  // 可以使用runtimeType或is查看变量是什么类型
  
  String QiShare = 'QiShare';
  if (QiShare.runtimeType == String) {
    print(QiShare);
    print('name:${QiShare}');
  }
  

/**
QiShare
name:QiShare
*/


// 使用is 查看变量的类型
String QiShare = 'QiShare';
  if (QiShare is String) {
    print('是String类型 :');
    print(QiShare);
  } else {
    print('非String类型');
  }
/* 输出结果:
是String类型 : QiShare
*/

变量的值的检查

// Check for an empty string.
var fullName = '';
if (fullName.isEmpty) {
  print('空字符串');
}

// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);
if(hitPoints <= 0) {
    print('hitPoints小于等于0');
}

// Check for null.
var unicorn;
if (unicorn == null) {
    print(null);
}

// Check for NaN. The global NaN property is a value representing Not-A-Number.
var iMeantToDoThis = 0 / 0;
if (iMeantToDoThis.isNaN) {
    print('Not a number');
}

  • 5. 类型推导
    使用var 声明的变量,通过输出变量的runtimeType ,可以发现变量的类型可以通过赋给变量的值,自动进行类型推导。
  var name = 'QiShare';
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  
  
/**

QiShare
String

*/

  var name = 10.0;
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  name = 10.1;
  
  if (name == null) {
    print('null');
  } else {
    print(name);
    print(name.runtimeType);
  }
  
  /**
    10
    int
    10.1
    double
  */

/*
上边的例子很有意思,推导出的10.0的类型为int;
推导出的10.1的类型为double。
笔者认为是编译器做了优化,具体怎么做的,笔者尚不清楚。
*/
  

当然除了类型推导知道变量的类型外,对于我们自己声明的变量,在已经确定变量类型的情况下,直接直观地声明变量类型即可。

那么对于var 这种变量的使用场景,笔者想到的有如下2种情况。

  • 1.接收服务端返回数据的时候,避免返回的数据类型和预期的有差异的情况,可以使用var 变量接收,然后通过类型检测后,再进一步进行数据地处理;

  • 2.对于某些函数接收的参数可能是多种类型的情况下,使用var 来修饰参数类型。

  • 6. Final and const
final 声明的变量只能赋值一次
final name = 'QiShare';
// name = 'QiShareQiShare';
// 报错:
const 是编译时常量
const name = 'QiShare'

final 或const修饰的变量只能赋值一次;

const 变量是编译时常量,在编译的时候,我们就已经知道了const 变量的值。

顶级的final 变量或类中的final变量在第一次使用的时候初始化。

这里举一个类中final变量初始化的例子:

class QiShareMember {
  final String memberID;
  final String memberName;
  QiShareMember(this.memberID, this.memberName);
}

// QiShareMember初始化实例
QiShareMember member = QiShareMember('id', 'name');


  • 7. List和Map
  var list = ['a', 'b', 1];

  // 遍历list
  list.forEach( (object){
     print('类型 ${object.runtimeType}');
     print('值${object}');
   }
  );

  // list 中的数据
  print(list.length);
              
/**
              
CONSOLE
类型 String
值a
类型 String
值b
类型 int
值1
*/



void main() {
  var gifts = {
// Keys      Values
  'first' : 'partridge',
  'second': 'turtledoves',
  'fifth' : 'golden rings'
};
  
  print(gifts);
  // 获取Map中的键值对数目
  print(gifts.length);
  
  // 遍历字典
  gifts.forEach(
    (key, value){
      print('key:${key}');
      print('value:${value}');
    }
  );
  
  /**
  
CONSOLE
{first: partridge, second: turtledoves, fifth: golden rings}
key:first
value:partridge
key:second
value:turtledoves
key:fifth
value:golden rings

  */

List相当于是Swift的数组;List的使用场景有:用于放置UI层面的列表数据宽泛内容;
Map相当于Swift的字典;Map的使用场景有:用于放置UI层面的列表数据中更具体内容;

举个例子:
比如说 如下的数据,根据List中的字典的个数可以确定,UI层面上,需要展示5个人的信息;
进一步根据List中,每一个字典中的name,和avatarUrl 可以确定更加细致的UI层面,每个人的个人信息的名字(name的值)和头像(avatarUrl 对应的图片)应该显示什么。

[
  {'name':'QiShare1',
  'avatarUrl':'https://www.so.com....jpg'
},
 
  {
  'name':'QiShare2',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare3',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare4',
  'avatarUrl':'https://www.so.com....jpg'
},

 {
  'name':'QiShare5',
  'avatarUrl':'https://www.so.com....jpg'
}


];
  • 8. 数据类型转换

下边是字符串和整数,浮点数之间的类型转换。

 // String -> int String 类型转换为int 类型
var one = int.parse('1');
 print(one.runtimeType);

// String -> double String 类型转为double类型
var onePointOne = double.parse('1.1');
  print(onePointOne.runtimeType);

// int -> String int 类型转换为String
String oneAsString = 1.toString();
print(oneAsString.runtimeType);

// double -> String double类型转换为String类型
String piAsString = 3.14159.toStringAsFixed(2);
print(piAsString.runtimeType);

/**

int
double
String
String
*/


// List类型转换 把子类型为dynamic的List转换为更为具体的子类型为String的List

  List<dynamic> dynmicList = ['QiShare', 'QiShare'];
  print(dynmicList.runtimeType);
  
  List<String>strList = List<String>.from(dynmicList);
  print(strList);
  print(strList.runtimeType);
  

  /**
  
JSArray
[1, 2]
JSArray<String>
  */
  
  • 9.方法

下边笔者举了一个说出QiShare 年龄的方法。

 int qiAgeNum = qiAgeNumber();
 qiSay('${words()} ${qiAgeNum}');

// 返回值为String类型,参数为空,名为words方法。
String words(){
  return 'QiShare Age:';
}

// 返回值为空类型,参数为String,名为qiSay的方法。
void qiSay(String words) {
  print(words);
}

// 返回值为空,参数为空的,名为qiSay方法。
void qiAge() {
  print(qiAgeNumber());
}

// 返回值为int,参数为空,名为qiAgeNumber 的方法。
int qiAgeNumber (){
  return 1;
}

/**

// 输出结果
QiShare Age: 1

*/

参考学习资料


推荐文章:
iOS 短信验证码倒计时按钮
iOS 环境变量配置
iOS 中处理定时任务的常用方法
算法小专栏:贪心算法
iOS 快速实现分页界面的搭建
iOS 中的界面旋转

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349