一個Java開發快速入門Darthtml
一個Android開發快速入門Flutter (二) python
很久沒寫博客了,意識到本身的憊懶,心裏至關愧疚……編程
日子很差混,做爲Android的移動開發,在某公司日子一天比一天難過,app各大模塊紛紛轉用前端weex框架,native端移動開發幾乎要失業了。前端框架
oschina都代碼格式都不支持dart,很急。weex
心裏焦慮,因而想着學點什麼充實下本身吧,前端框架的選擇挺多的,weex是一個(資料是真的少……),另外一個我頗爲看好的就是Flutter。Flutter的主要語言是Dart (我真是氣啊,爲何沒個東西出來都要用一些奇奇怪怪的語言,你用python不行?你tensorflow怎麼就用python呢!)。那麼學習Dart的一些基本語法就是至關必要的了。另外,聽說谷歌正在開發,不知道能不能取代Android的Fuchsia前端用的就是Flutter框架了。這都不學?等着被淘汰嗎?app
本文的後續內容徹底是按照 https://codelabs.flutter-io.cn/codelabs/from-java-to-dart-cn/index.html#0 這裏一點點寫下來的,這裏只是將知識點直接用註釋的方式寫入了dart代碼中,更方便看而已,可以讓一個java開發者急速瞭解dart的基礎規則。框架
class Bicycle { //dart沒有 private ,public 等關鍵字,默認都爲public int cadence; // 前面加 _表示只讀,而且private(僅在該文件內可用) // 若是不設置初始值,默認是null // *** 注意int類型默認也是null。*** int _speed = defalutSpeed; int gear; Bicycle(this.cadence, this.gear); // 等同於 Bicycle(int cadence,int gear){.....} //默認的dart會爲全部dart公開變量提供setter和getter方法 //非公開變量須要本身定義getter 和 setter方法 int get speed => _speed; /* * 只有一行代碼的時候可使用 => * 全部類都有toString方法。 * */ @override //重寫關鍵字 //字符串可使用單引號或者雙引號。 //字符串內部可使用 ${} 或者只是$ 進行格式化 String toString() => 'Bicycle: $_speed mph'; void applyBrake(int decrement) { _speed -= decrement; } void speedUp(int increment) { _speed += increment; } } //在類中能夠直接使用外部定義的變量。 int defalutSpeed = 100; /** * main() 方法是 Dart 的主方法,若是你須要訪問命令行傳遞過來的參數。 * 可使用 main(List<String> args 方法。 * * 在 Dart 中你能夠在類以外編寫代碼,變量、方法、存取方法均可以獨立於類以外維持生命週期。 * * */ void main() { //new 關鍵字可選,變量用var聲明,類型自動推斷 // final變量用final聲明 ,final var 必須省略成 final final bike = Bicycle(2, 1); print(bike.speed); print(bike); for (int i = 0; i < 5; i++) { print('hello ${i + 1}'); } }
import 'dart:math'; class Rectangle { int width; int height; Point origin; /** * 敲黑板了,dart中常用這種定義,弄得人很懵. * 嵌套在閉合的花括號中 ({}) ,用來表示它們是可選的命名參數。 * 這樣的賦值代碼代表給實例變量提供了默認的值。(必須有 {} ) * 甚至你可使用相似 Rectangle(this.origin , {this.width = 0, this.height = 0}); 這樣前邊必選,後面可選 * 而後代碼調用 Rectangle(const Point(10, 20), width: 100, height: 200) ,前面的參數沒有名字 */ Rectangle({this.origin = const Point(0, 0), this.width = 0, this.height = 0}); @override String toString()=>'Origin: (${origin.x}, ${origin.y}), width: $width, height: $height'; } main() { //調用構造函數,可是對參數進行了選擇。依稀記得kotlin中也有相似用法哦。 print(Rectangle(origin: const Point(10, 20), width: 100, height: 200)); print(Rectangle(origin: const Point(10, 10))); print(Rectangle(width: 200)); print(Rectangle()); }
import 'dart:math'; //這裏的abstract和java中的相似 abstract class Shape { //至關於abstract方法,另外get關鍵字表示是一個get方法,實現能夠直接 shape.area這樣獲取值。 num get area; //num是 數值類型的基類,有兩個子類 int 和 double num getAA(){return 1;} } //implements繼承接口 class Circle implements Shape { final num radius; Circle(this.radius); @override //關鍵字能夠省略 num get area => pi * pow(radius, 2); // 使用了implements關鍵字繼承,至關於繼承接口 // 必須重寫,並且父類中的實現是被忽略的 @override num getAA(){return 1;} } //使用 extends繼承,和java中的繼承同樣。 class CircleMock extends Shape { final num radius; CircleMock(this.radius); num get area => pi * pow(radius, 2); } //總結,使用implements和extends集成一個類是不一樣的 //dart只能有一個extends類,可是能夠有多個interface和java同樣 /** * 能夠看到,雖然circle是一個普通類,可是仍是可使用implements * 可是circle內部全部的實現都被拋棄了,須要在子類從新實現 */ class CircleMock2 implements Circle{ @override num get area => null; @override num getAA() { return null; } @override num get radius => null; } class Square implements Shape { final num side; Square(this.side); num get area => pow(side, 2); num getAA(){return 1;} } Shape shapeFactory(String type) { if (type == 'circle') return Circle(2); if (type == 'square') return Square(2); throw 'Can\'t create $type.'; //拋出錯誤 } main() { final circle = shapeFactory('circle'); final square = shapeFactory('square'); print(circle.area); print(square.area); }
文檔後面寫的函數式編程是個雞脖?? 質量過低了,因此這裏省略了,由於若是你知道函數式編程,那麼那篇文檔就是廢話,若是你不知道函數式編程,那麼,那篇文檔就是廢話。等到後面進階的時候補上dart的函數式編程吧。ide
看懂了上面的基本代碼,你就能夠說已經掌握了dart中經常使用的寫法,可是在閱讀代碼過程當中仍然會有不少讓你困惑的內容,這是時候,若是你須要更全的語法規則,能夠參考官方文檔。