做做Flutter-Day02

影山小麥機
8 min readJun 13, 2023

今天聊聊Dart語法:宣告、註解、引入Library

前言

在以前自學的習慣中,我會花上一些時間先著墨在語法上,但在我的印象中,語法這件事情其實不會花太多的篇章,這邊主要會以物件導向的角度來切入,讓學習者、我自己可以清楚地知道說現在我們在做些什麼。

今天原則上會提到的內容主要是談談怎麼宣告物件,畢竟我是一個iOS開發者,所以可能會比較多的是用Swift、Objective-C的角度去描述這篇文章,那麼,咱們就開始吧!

正文

在官方語法裡,宣告個Dart物件,以下提供兩種宣告的方式:

  1. 變數宣告
var name = "影山小麥機";

不過站在Swift使用者的角度,不禁會覺得分號有點麻煩,每次都要額外做這件事情阿雜。

2. 常數宣告

const name = "影山小麥機";
final name = "影山小麥機";

Swift是用let,但這邊會是用const來做宣告,不過好像也可以用final來做宣告。其實意思幾乎是一樣的,就是你沒有要再對這個物件做出改變。

不管是常數或是變數,在宣告型別的時候,有點像是Objective-C在宣告物件的感覺,你會先給出型別的宣告,然後才是你的物件或屬性的名稱,然後才給它分號(分號真的很討厭77):

Object name = "影山小麥機";

String name = "影山小麥機";

在Swift裡面叫做optional的概念,Flutter裡面也有,其實算是一種對於型別可有可無的描述,或者可以說是不確定這個物件現在的狀態。

在Flutter的官方文件中,叫做Null safety,在實際宣告的時候就像是下面這樣:

String? name = "影山小麥機";

//or

String? name;

那假如要使用這個具有Null Type的物件的話,你一定得要先初始化它,你才可以使用。

不過,你可能在使用的時候會遇到如果我想要給定預設值(Default Value)的時候,我應該怎麼辦?

以下提供一個語法讓你實際的看看這個物件應該怎麼用:


int? nullableValue;
int nonNullableValue = nullableValue != null ? nullableValue : defaultValue;

//or

int? nullableValue;
int nonNullableValue = nullableValue ?? defaultValue;

在Dart中,你可以使用條件運算符(conditional operator)和空值判斷(null-aware operators)來處理可為空(nullable)值,看起來就是要直接用條件處理Null值的樣子,這樣的方式看起來跟Swift的if let 或是 guard let多出兩種途徑比,好像更直觀一點。

Late Variable

這個概念比較特別,有點像是Swift的lazy var 的懶加載,其實就是晚一點再初始化的概念,在官方網站的定義是這樣:

The late modifier has two use cases:

  • Declaring a non-nullable variable that’s initialized after its declaration.
  • Lazily initializing a variable.
late String name;

void setName() {
name = "影山小麥機"
print(name);
}

你可以想像,我宣告一個屬性或物件的盒子,但裡面還沒給東西,然後可能做了某件事情後,我決定塞東西進去裡面。

這個概念跟上一個段落提到的Null Safety有點不太一樣,Null Safety都是主打一個概念,叫做「這個東西可能有,也可能沒有。」,在Swift跟Dart裡都有類同的概念。

不過,在使用情境上,可能就要稍微判斷一下你想要拿這件事情做些什麼而選擇設計這個物件。畢竟一個對語法熟悉的工程師,最好是在使用的當下就決定好之後可能會有怎麼樣的使用者情境而決定細節的設定。

註解

接下來這個段落會稍微講一下比較枝微末節的小語法:

在Dart裡面,下註解是三個斜線:

/// 影山小麥機
/// 吃飽撐著要學點Flutter
/// 但好難吃飽

然後如果要下多行的註解,可以像下面這樣:

class {
/*

這邊是多行的註解內容
但我很懶

*/

}

然後在Dart裡面如果要使用MetaData去註解一些資訊,可以自己寫,比如在官方文件中其實提供了一個範例:


class iPhone {

@Depreated('Use turn on Instead')
void activate() {
turnOn();
}

void turnOn() {

}
}

自己定義的MetaData,比如在官方網站上的Todo這個範例


class Todo {

final String who;
final String what;

const Todo(this.who, this.what);
}

如果我上面定義這些文法,那實際上使用呢?

@Todo('影山小麥機','做作Flutter')

void doSomethind() {
print("do something");
}

不過看起來,MetaData自己定義算是一個之前在Swift可能不會特別用到的寫法,其實主要會出現的地方也就是像註解那樣,ChatGPT給了我一個比較明確的定義來描述MetaData:

「Metadata(元資料)是用來給程式碼元素(類別、函式、變數等)添加額外的資訊和註解的特殊語法。Metadata提供了一種在程式碼中添加額外資訊的機制,這些資訊可以用於執行時的處理或靜態分析。」

在預設之中,也有一些MetaData可以使用,比如:@Deprecated, @deprecated, and @override

關於Library、import

基本上在引進Library這件事情上,語法格式大概是像下面這樣

import 'package:lib1/lib1.dart';

// 或者你也可以下面這樣的寫法

import 'package:lib2/lib2.dart' as lib2;

上面兩個寫法的差別大概在於:

// 如果我今天要使用lib1的內容,我可能會這樣用:

Element1 element1 = Element1();

// 如果我今天要使用lib2的內容,我會這樣用:

lib2.Element element2 = lib2.Element2();

其實上面的語法差別大概就是可讀性的提高,這樣在維護程式碼的時候會很方便:)

然後也有一些方式是不要引進所有的Library,我們引進部分或是不引進某些,我們會使用Show或是Hide這個關鍵字,使用起來會像下面這樣:


// 下面這個範例就是只會引進lib裡面的foo這段內容
import 'package:lib1/lib1.dart' show foo;


// 下面這個就是引進所有的Library,但是foo的部分不引進
import 'package:lib2/lib2.dart' hide foo;

延遲載入套件:

大概味道有點像是late的關鍵字的作法,主要的用法大概有下面這三點:

  • To reduce a web app’s initial startup time.(減少出初始化的時間)
  • To perform A/B testing — trying out alternative implementations of an algorithm, for example.(為了進行A/B測試,例如嘗試替代的演算法實現。)
  • To load rarely used functionality, such as optional screens and dialogs.(為了載入很少使用的功能,例如可選的螢幕和對話框。)

那實際上在程式碼中會怎麼寫呢?

import 'package:greetings/hello.dart' deferred as hello;

//deferred as hello就是Library延遲載入的部分

後記

最近很常寫程式寫累了就去騎自行車跑山,幸好是住在台中,隨便一出門就可以想現在是要往大坑、新社的方向走,還是望高寮那附近處理一下想要放風的感覺就好了,總而言之,最近的悠閒其實還不賴。

最近很常聽各種不同類型的音樂,大抵上有點脫離以前習慣總是爵士樂的感覺,多聽聽一些老歌,還有一些編曲比較不複雜的作品。

不過還是很喜歡爵士樂:)

最近很想再刷一次阿甘正傳,很喜歡Forrest Gump傻傻地過一生,活得高低起伏,但好像又不會過度憂慮些什麼的生活。

Sign up to discover human stories that deepen your understanding of the world.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

影山小麥機
影山小麥機

Written by 影山小麥機

本職為Mobile工程師,熱愛分享視野,也樂意站在ChatGPT的肩膀上。訂閱小麥機,收割技術、職涯、人生的難題。

No responses yet

Write a response