Dart是一个怎样的dart语言前景

10940人阅读
Android(32)
从接触编程到现在,除了搞过几天JQuery,几乎没怎么写过Javascript,刚刚看了两篇介绍 ECMAScript6 的文章,突然觉得没写过JS也没什么好遗憾的。
ES6 好像从2009年就开始制定了,现在终于支持 forEach、for-in等操作,也支持Map、Set等数据类型,而且为了考虑兼容性问题居然引入了一个 for-of,不过看到
上关于 github 语言的统计数据,不得不佩服JS社区强大的生产力。
话说回来,Dart 作为一个崭新的语言,自诞生那天起就抛去了向下兼容的历史包袱,而且可以直接转成 Javascript,Chrome 的 V8 团队还专门为 Dart 做了一个虚拟机 - Dartium。
Dart 目的跟 Node 一样,也是为了统一前后端开发,这一点在上一篇文章 ( )已经说过了,所以用 Dart 做 web 开发也没有额外的学习成本,当然前提是你得会写 Dart。
官方教程提供的一个简单的 web 开发教程 - ,用DartEditor导入后,工程结构如下图所示:
有css,有html,一个最简单的web工程(没有后端),在 DartEditor 中可以用两种方式来运行这个工程。
如果选择了 Dartium,编译成功后会唤起一个使用了 Dartium 引擎的 chrome 浏览器,而过选择了 Run as JavaScript 就会先把 dart 编译成 js 的工程(工程结构图中灰色的部分),然后唤起一个使用了 V8 引擎的 chrome 浏览器。
其实用 Dart 做开发还是挺方便的,js 都是可以直接拿来用的,但是社区不成熟,不像 node 社区那样有那么多的库。
我们再来看看下一代 Android 开发框架 - ,今天照着 readme 玩了一下官方提供的几个demo,流畅度可以跟 native 媲美,但是需要从网络加载代码,所以启动时间比较慢,毕竟只是一个实验版本,像 react-native 那样做个本地缓存也不会有什么问题。
整个开发过程与上面的 web 开发非常相似,只不过代码文件的后缀名换了而已。
首先需要创建一个 pubspec.yaml,类似于 Node 的 package.json 或者 gradle 脚本的 build.gradle,主要是一些包依赖关系和 APP 的基本信息,最后一行表示依赖最新版本的 sky。
name: your_app_name
dependencies:
在当前目录下执行 pub get,会根据 pubspec.yaml 的依赖配置获取 APP 所依赖的包。
widgets git:(master) ? pub get
Resolving dependencies... (1.7s)
+ mojo 0.0.5+dart-summit-1
+ sky 0.0.5+dart-summit-7
Changed 2 dependencies!
widgets git:(master) ?
执行完毕后会发现在本地多了一个 package 文件夹,里面有刚刚下载的两个包。
pub会首先把下载来的包缓存到本地,如果有的新的下载可以直接引用之前下载过的包。
sky 我们都知道了,它就是 Android 全新的开发框架,由两部分组成:
The Sky engine. The engine is the core of the system. Written in C++, the engine provides the muscle of the Sky system. The engine provides several primitives, including a soft real-time scheduler and a hierarchial, retained-mode graphics system, that let you build high-quality apps.
The Sky framework. The framework makes it easy to build apps using Sky by providing familiar user interface widgets, such as buttons, infinite lists, and animations, on top of the engine using Dart. These extensible components follow a functional programming style inspired by React.
简单来说,Sky engine 是一个图形系统,VDOM 的创建和diff应该也是它负责的,而 Sky framework 则是一个UI库,提供了我们创建 VDOM 时所需的节点元素。
那 mojo 又是什么呢?
Mojo is an effort to extract a common platform out of Chrome's renderer and plugin processes that can support multiple types of sandboxed content, such as HTML, Pepper, or NaCl.
简单来说,mojo 就是 sky 的运行时环境,但是 domokit 下还有一个,这个 sdk 为我们提供给了基于 mojo 做二次开发所用到的 API。
The Mojo Public API is a binary stable API to the Mojo system.
它支持很多种语言,目前为止包括 C、CPP、Dart、Go、Java、js。
也就是说,Google 想打造的是这样一个生态系统。
如果这个愿景能够实现,120fps的卖点也许会一统江湖,但是 Google IO 2015 根本没有提及这个项目,希望 Google 不是玩票 :(
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:652846次
积分:7504
积分:7504
排名:第2065名
原创:170篇
转载:27篇
评论:217条
阅读:6916
阅读:55248Dart 语言简易教程(五) - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了30872字,被13人关注,获得了8个喜欢
Dart 语言简易教程(五)
Dart 语言简易教程(四):
Dart 语言简易教程(五)
流程控制语句
Dart 可用的流程控制语句:
if and else
while and do-while loops
break and continue
switch and case
try-catch and throw
if and else
Dart 支持if 及 else的多种组合。和Python,Java,C++ 都有类似的操作。
if (isRaining()) {
you.bringRainCoat();
} else if (isSnowing()) {
you.wearJacket();
car.putTopDown();
如前面的教程里面提到的那样,Dart 中只有变量值为true 的时候才会返回true 的结果。
for 循环的例子:
var message = new StringBuffer("Dart is fun");
for (var i = 0; i & 5; i++) {
message.write('!');
除了常规的for 循环外,针对可以序列化的操作数,可以使用forEach() 方法。当不关心操作数的当前的下标的时候,forEach()方法是很简便的。例子:
var collection = [0, 1, 2];
for (var x in collection) {
While and do-while
while 循环的例子:
var _temp = 0;
while(_temp & 5){
print("this is loop: " + (_temp).toString());
do-while 循环的例子:
var _temp = 0;
print("this is loop: " + (_temp).toString());
while(_temp & 5);
上面的两个例子都对应如下输出:
this is loop: 0
this is loop: 1
this is loop: 2
this is loop: 3
this is loop: 4
Break 和 continue
break 用来跳出循环
while (true) {
if (shutDownRequested())
processIncomingRequests();
continue 用来跳过本次循环
for (int i = 0; i & candidates. i++) {
var candidate = candidates[i];
if (candidate.yearsExperience & 5) {
candidate.interview();
Switch 和 case
Dart 中switch / case 语句使用== 操作来比较整数,字符串或其它编译过程中的常量,从而实现分支的作用。switch / case 语句的前后操作数必须是相同的类型的对象实例(即使其中一个操作数属于另一个对象的子类的实例,比较操作也不行。)
每一个非空的case 子句(不是case 判断语句本身,而是case 语句下面的实际操作。)最后都必须跟上break 语句。
var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
// ERROR: Missing break causes an exception!!
case 'CLOSED':
executeClosed();
var command = 'CLOSED';
switch (command) {
case 'CLOSED': // Empty case falls through.
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
使用switch / case 语句,配合 continue 语句。可以实现类似 goto 语句的功能。
var command = 'CLOSED';
switch (command) {
case 'CLOSED':
executeClosed();
continue nowC
// Continues executing at the nowClosed label.
nowClosed:
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeNowClosed();
断言(assert)
Dart 语言通过使用assert 语句来中断正常的执行流程,中断的前提是:assert 判断的条件为 false 。
// Make sure the variable has a non-null value.
assert(text != null);
assert 判断的条件可以是任何可以转化为 boolean 类型的对象,即使是函数也可以(此时判断的是函数返回值)。
如果assert 的判断为true, 则继续执行下面的语句。反之则会丢出一个异 AssertionError 。
异常(Exceptions)
Dart 代码可以丢出或捕获异常。异常表明发生了一些不预期的错误。如果不捕获异常,一旦异常发生,则程序和中断执行并停止运行。
Dart 代码不会在代码中指定代码将会丢出什么异常,所以调用系统代码时,不会强制要求处理异常。这点与Java 的处理方式是不同的。
Dart 提供 Exception 和 Error 类型来处理异常。自己也可以定义属于自己的异常类型。
用于抛出异常。
throw new FormatException('Expected at least 1 section');
也可以通过throw 语句释放任意的类型:
throw 'Out of llamas!';
因为抛出异常属于表达式,可以将throw 语句放置在 =&语句中:
distanceTo(Point other) =&
throw new UnimplementedError();
捕获(Catch)
基本用法与Python 相同。将可能出现异常的代码放置到try 语句中,然后在气候跟上 catch 语句来处理可能出现的异常。可以通过 on语句来指定需要捕获的异常类型,使用catch 来处理异常。
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()传递1个或2个参数。第一个参数表示:捕获的异常的具体信息,第二个参数表示:异常的堆栈跟踪(stack trace)。
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
rethrow语句用来处理一个异常,同时希望这个异常能够被其它调用的部分使用。如下的代码:
final foo = '';
void misbehave() {
foo = "You can't change a final variable's value.";
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
// Allow callers to see the exception.
void main() {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
Dart 的finally用来执行那些无论异常是否发生都执行的操作。
breedMoreLlamas();
} catch(e) {
print('Error: $e');
// Handle the exception first.
} finally {
cleanLlamaStalls();
// Then clean up.
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
干货技术文。
· 3657人关注
Android,Java,前端,Node.js,React,React Native
· 2389人关注
· 6人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:6383人阅读
Android(32)
Web前端(21)
这几天看到一篇新闻 - ,对与新闻的标题和内容无力吐槽,不做评论。但是Google推出
似乎证明了native的开发方式越来越向web方式靠近的趋势,最近比较火的要数
了,他们的原理是类似的,都是先构造一个 virtual dom tree,然后只更新发生变化的 dom。sky 的 readme 也说自己参考了 ,那两者最大的区别应该是开发语言了,react-native 是 javascript,而 Google 用的是自己的亲儿子 - 。
Node.js 推出后统一了前后端,如今 node 开发真可谓炙手可热。Google 当初推出 Dart 也是为了统一前后端开发,但是这两年一直不温不火,好像国内使用
的开发者也不多,现在用 突然宣布说用 Dart 替换 Android 的开发语言 java,而且还举办了第一个第一届 ,看来 Google 准备在 Dart 上发力了,相信 Dart 会是五月底 Google IO 大会上的一个重要议题。
趁着今天放假,跟着 玩了一下 Dart,发现 Dart 这门语言确实不错。
包的引用方式与 Python 和 Go 类似,都是用 import:
import 'dart:html';
不过只导入包的某个组件的方式比较特殊:
import 'dart:math' show R
import 'dart:convert' show JSON;
import 'dart:async' show F
Dart 与 Python 一样是一个强类型语言。
Dart 的变量类型是可选的,叫做 static type annotations。
Dart’s optional types are static type annotations that act as documentation, clearly expressing your intent.
static final Random indexGen = new Random();
String _firstN
Dart 没有 private 关键字,如果变量或方法是私有类型,需要在名称前面加上下划线。
class PirateName {
String _firstN
static _parsePirateNamesFromJSON(String jsonString) {
Map pirateNames = JSON.decode(jsonString);
names = pirateNames['names'];
appellations = pirateNames['appellations'];
Dart 用关键字 as 来做类型转换。
void updateBadge(Event e) {
String inputName = (e.target as InputElement).value;
对于某些特定方法,Dart 提供了语法糖,写法很简单。例如,表达式的值即为返回值的情况,可以这么写:
String toString() =& pirateN
不用写成这样:
String toString() {
return pirateN
如果是 get 方法,可以直接在返回值类型和方法名之间加上一个关键词 get,而且方法名不需要加括号,调用的时候也不需要加括号。
String get jsonString =& JSON.encode({"f": _firstName, "a": _appellation});
String get pirateName =&
_firstName.isEmpty ? '' : '$_firstName the $_appellation';
级联操作符(..)
级联操作符(The cascade operator (..))可以允许在一个成员变量上执行多个操作。
genButton..disabled = false
以上语句就等价于
genButton.disabled = false;
genButton.text =
字符串转换
Dart 中变量转化成字符串比 Java 方便多了,跟 Python 有一拼,直接在变量名前加上$符号就可以了。
'$_firstName the $_appellation';
Dart 支持有名字的构造方法,这一点比 Java 和 Python 都先进。
PirateName.fromJSON(String jsonString) {
Map storedName = JSON.decode(jsonString);
_firstName = storedName['f'];
_appellation = storedName['a'];
这里 PirateName.fromJSON 是一个整体,用的时候要写全了。
return new PirateName.fromJSON(storedName);
跟 Python 一样,Dart 也支持 ,例如参数可以这么写:
PirateName({String firstName, String appellation}) {
参数要用一个大括号括起来,应该是需要把参数封装成一个类似于 Python 的 Dictionary。
但是调用的时候不需要传递所有的参数。
new PirateName(firstName: inputName)
Dart 支持泛型,这点跟 Java 很像,例如要定义一个 List 变量可以写成这样:
static List names = [];
static List appellations = [];
如果要写明类型,就需要在 List 后的简括后内加上类型。
static List&String& names = [];
static List&String& appellations = [];
关于泛型类型是否像 java 那样支持 super、 extend还没看到,暂时不知道。
Dart 语言原生支持异步操作,主要是用两个关键词 await 和 async。
例如,如果我们要定义一个异步方法,不需要像 java 那样去 new Thread,直接在方法后面加上 async 关键字就OK了,这样调用时,该方法时会直接返回一个 Future,caller 无需等待。
static Future readyThePirates() async {
String path = 'piratenames.json';
String jsonString = await HttpRequest.getString(path);
_parsePirateNamesFromJSON(jsonString);
await 跟 java中的 wait 方法用法一样,表示等待,但是它只能用于 async 的方法中。
例如上面代码片段中, await HttpRequest.getString(path) 就表示必须要等到 HttpRequest.getString(path) 返回的 Future 有了最终结果才会继续往下执行 _parsePirateNamesFromJSON(jsonString);。
不知道 Dart 支不支持一些高大上的语言特性,比如 闭包(Closure)、Lambda表达式(Lambda expression)、生成器(Generator)等,期待后续的学习。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:652848次
积分:7504
积分:7504
排名:第2065名
原创:170篇
转载:27篇
评论:217条
阅读:6916
阅读:55248第三方登录:

我要回帖

更多关于 dart语言程序设计 的文章

 

随机推荐