「Dart」の版間の差分
ナビゲーションに移動
検索に移動
(→コメント) |
|||
(同じ利用者による、間の35版が非表示) | |||
1行目: | 1行目: | ||
==[[Dart]]== | ==[[Dart]]== | ||
− | [[Flutter]] | | + | |[[Flutter]] | [https://www.typea.info/blog/index.php/category/flutter/ ブログカテゴリ(Flutter)] | [[Android Studio]] | [[Flutter macos]] | [[FlutterFire]] | [[Flutter 手順]] | |
{{amazon|B00JB3CWZI}} | {{amazon|B00JB3CWZI}} | ||
*https://dart.dev/ | *https://dart.dev/ | ||
+ | ===言語仕様=== | ||
+ | ---- | ||
*[https://dart.dev/guides/language/spec 言語仕様] | *[https://dart.dev/guides/language/spec 言語仕様] | ||
+ | *[https://dart.dev/guides/language/specifications/DartLangSpec-v2.10.pdf 言語仕様2.1] | ||
+ | *[https://www.cresc.co.jp/tech/java/Google_Dart2/introduction/main_page.html Dart2解説] | ||
+ | |||
+ | ==[https://dart.dev/guides/language/effective-dart/design#prefer-type-annotating-public-fields-and-top-level-variables-if-the-type-isnt-obvious Effective Dart]== | ||
+ | *[https://dart.dev/guides/language/effective-dart/design#prefer-type-annotating-public-fields-and-top-level-variables-if-the-type-isnt-obvious Effective Dart] | ||
+ | |||
==基本== | ==基本== | ||
===Install=== | ===Install=== | ||
+ | ---- | ||
====[[Windows]]==== | ====[[Windows]]==== | ||
+ | ---- | ||
*http://www.gekorm.com/dart-windows/ | *http://www.gekorm.com/dart-windows/ | ||
====[[Mac]]==== | ====[[Mac]]==== | ||
+ | ---- | ||
*https://dart.dev/get-dart | *https://dart.dev/get-dart | ||
*install | *install | ||
19行目: | 30行目: | ||
$ brew upgrade dart | $ brew upgrade dart | ||
===[[Dart]]Pad=== | ===[[Dart]]Pad=== | ||
+ | ---- | ||
*https://dartpad.dartlang.org/ | *https://dartpad.dartlang.org/ | ||
===APIリファレンス=== | ===APIリファレンス=== | ||
+ | ---- | ||
*https://api.dart.dev/stable/2.5.0/index.html | *https://api.dart.dev/stable/2.5.0/index.html | ||
===パッケージ=== | ===パッケージ=== | ||
+ | ---- | ||
*[[Dart]]標準は、dart: | *[[Dart]]標準は、dart: | ||
import 'dart:html'; | import 'dart:html'; | ||
*ローカルは相対パス(dart:省略) | *ローカルは相対パス(dart:省略) | ||
*pubパッケージマネージャ | *pubパッケージマネージャ | ||
+ | ====パッケージから特定のオブジェクトのみimportする==== | ||
+ | ---- | ||
+ | *import [package] show [objects] | ||
+ | import 'package:google_sign_in/google_sign_in.dart' | ||
+ | show GoogleSignIn, GoogleSignInAccount; | ||
+ | |||
===Hello=== | ===Hello=== | ||
+ | ---- | ||
*hello.dart | *hello.dart | ||
void main() { | void main() { | ||
37行目: | 58行目: | ||
==型== | ==型== | ||
===数値=== | ===数値=== | ||
+ | ---- | ||
====numのサブクラス==== | ====numのサブクラス==== | ||
+ | ---- | ||
*int | *int | ||
*double | *double | ||
===真偽=== | ===真偽=== | ||
+ | ---- | ||
*bool | *bool | ||
===文字列=== | ===文字列=== | ||
+ | ---- | ||
====String==== | ====String==== | ||
+ | ---- | ||
*https://api.dart.dev/stable/2.5.0/dart-core/String-class.html | *https://api.dart.dev/stable/2.5.0/dart-core/String-class.html | ||
=====補完===== | =====補完===== | ||
+ | ---- | ||
*${} | *${} | ||
print("Hello ${this.name}."); | print("Hello ${this.name}."); | ||
====リテラル==== | ====リテラル==== | ||
+ | ---- | ||
*一重、二重引用符 | *一重、二重引用符 | ||
*引用符3�つ重ねで複数行 | *引用符3�つ重ねで複数行 | ||
− | ==== | + | ====StringBuffer==== |
+ | ---- | ||
+ | *https://api.dart.dev/stable/2.7.2/dart-core/StringBuffer-class.html | ||
+ | |||
+ | ====Runes==== | ||
+ | ---- | ||
*UTF-32型の文字 | *UTF-32型の文字 | ||
*絵文字などの表現 | *絵文字などの表現 | ||
+ | |||
===コレクション=== | ===コレクション=== | ||
+ | ---- | ||
====List==== | ====List==== | ||
+ | ---- | ||
*[] | *[] | ||
*add | *add | ||
68行目: | 104行目: | ||
*map | *map | ||
*reduce | *reduce | ||
+ | =====連結===== | ||
+ | <pre> | ||
+ | void main() { | ||
+ | var l = [1,2,3]; | ||
+ | print(l); | ||
+ | [...l, 4, 5, 6]; | ||
+ | print(l); | ||
+ | l = [...l, 4, 5, 6]; | ||
+ | print(l); | ||
+ | } | ||
+ | </pre> | ||
+ | *結果 | ||
+ | <pre> | ||
+ | [1, 2, 3] | ||
+ | [1, 2, 3] | ||
+ | [1, 2, 3, 4, 5, 6] | ||
+ | </pre> | ||
+ | |||
====Map==== | ====Map==== | ||
+ | ---- | ||
*{} | *{} | ||
*remove | *remove | ||
74行目: | 129行目: | ||
*forEach | *forEach | ||
*containsKey | *containsKey | ||
+ | |||
====== | ====== | ||
====Symbol==== | ====Symbol==== | ||
+ | ---- | ||
*[[Dart]]の構文での演算子や識別子 | *[[Dart]]の構文での演算子や識別子 | ||
− | ====Functions==== | + | ====[https://www.cresc.co.jp/tech/java/Google_Dart2/language/functions/functions.html Functions]==== |
− | *関数 | + | ---- |
+ | *[https://www.cresc.co.jp/tech/java/Google_Dart2/language/functions/functions.html 関数] | ||
+ | |||
+ | *関数は実行可能なアクションの抽象化 | ||
+ | *関数もオブジェクトでその型はFunction | ||
+ | *関数は第1級関数(first-class function)であり、ある関数を別の関数にパラメターとして渡すことも可能 | ||
+ | |||
====Enum==== | ====Enum==== | ||
+ | ---- | ||
*列挙 | *列挙 | ||
+ | enum Menu { google_sign_in, firestore_cloud_vision } | ||
+ | **値を割り当てるだめの妥協 | ||
+ | <pre> | ||
+ | class Status { | ||
+ | static const int created = 10; | ||
+ | static const int deleted = 90; | ||
+ | } | ||
+ | </pre> | ||
+ | |||
==文法== | ==文法== | ||
===基本=== | ===基本=== | ||
+ | ---- | ||
*セミコロン必須 | *セミコロン必須 | ||
====エントリーポイント ==== | ====エントリーポイント ==== | ||
+ | ---- | ||
*void main() もしくは、void main(List<String> args) | *void main() もしくは、void main(List<String> args) | ||
====コメント ==== | ====コメント ==== | ||
+ | ---- | ||
+ | =====単一行===== | ||
*// | *// | ||
+ | |||
+ | =====複数行===== | ||
*/*...*/ | */*...*/ | ||
− | */// | + | |
+ | =====ドキュメンテーション===== | ||
+ | */**または///で始まる | ||
+ | * 角括弧を使ってクラス、メソッド、フィールド、トップ・レベル変数、及びパラメタを参照可能 | ||
+ | * 角括弧内の名前はそのドキュメント化されたプログラム要素の構文スコープ内で解決 | ||
+ | *[https://dart.dev/guides/language/effective-dart/documentation ドキュメンテーション] | ||
+ | *[https://github.com/dart-lang/dartdoc#dartdoc ドキュメンテーションツール] | ||
===変数=== | ===変数=== | ||
+ | ---- | ||
====var==== | ====var==== | ||
+ | ---- | ||
*型推論 | *型推論 | ||
*初期値null | *初期値null | ||
*型宣言 | *型宣言 | ||
+ | |||
+ | ====[https://dart.dev/guides/language/language-tour#late-variables late]==== | ||
+ | ---- | ||
+ | *https://qiita.com/nukotsuka/items/66236723bf17c4574608 | ||
+ | *遅延初期化 | ||
+ | *宣言後に初期化されるnon-nullable変数の宣言 | ||
+ | **lateで修飾した変数は、宣言時にthisにアクセス可能 | ||
+ | |||
===定数=== | ===定数=== | ||
+ | ---- | ||
====final==== | ====final==== | ||
+ | ---- | ||
*再代入不可 | *再代入不可 | ||
====const==== | ====const==== | ||
+ | ---- | ||
*コンパイル時点で評価 | *コンパイル時点で評価 | ||
:;オブジェクトの変更禁止 | :;オブジェクトの変更禁止 | ||
107行目: | 205行目: | ||
List<int> list2 = const [1, 2, 3]; | List<int> list2 = const [1, 2, 3]; | ||
list2.add(4); // エラーが発生 | list2.add(4); // エラーが発生 | ||
+ | ===コンストラクタ=== | ||
+ | ---- | ||
+ | *https://dev.classmethod.jp/articles/about_dart_constructors/ | ||
+ | class Book { | ||
+ | String title; | ||
+ | String author; | ||
+ | |||
+ | Book(); | ||
+ | |||
+ | Book.fromMapWithTitle({Map<String, dynamic> map, String title}) { | ||
+ | title = title; | ||
+ | author = map["author"]; | ||
+ | } | ||
+ | |||
+ | Book.fromMap(Map<String, dynamic> map) : | ||
+ | this.fromMapWithTitle(map:map); | ||
+ | } | ||
+ | |||
===関数=== | ===関数=== | ||
+ | ---- | ||
*第1級オブジェクト | *第1級オブジェクト | ||
*宣言 | *宣言 | ||
− | + | *関数もオブジェクトでその型はFunction | |
+ | *Dartの関数は第1級関数(first-class function)である。 | ||
+ | *関数を別の関数にパラメタとして渡すことも可能である. | ||
int someFunc2(int a, int b) { | int someFunc2(int a, int b) { | ||
return a + b; | return a + b; | ||
} | } | ||
− | ====1行==== | + | ====1行 矢印構文(arrow syntax)==== |
+ | ---- | ||
+ | * => exprという構文は{ return expr; }の短縮形 | ||
+ | <blockquote>式のみが矢印(=>)とセミコロン(;)の間に置かれる。例えば、if文はおけないが、条件式は使える。</blockquote> | ||
bool isHoge(String str) => str == "hoge"; | bool isHoge(String str) => str == "hoge"; | ||
+ | |||
====引数の指定==== | ====引数の指定==== | ||
+ | ---- | ||
someFunc3(a: 1, b: 2, c: 3); | someFunc3(a: 1, b: 2, c: 3); | ||
====オプション引数==== | ====オプション引数==== | ||
+ | ---- | ||
String conc(String a, String b, [String c]) | String conc(String a, String b, [String c]) | ||
====デフォルト引数==== | ====デフォルト引数==== | ||
+ | ---- | ||
int someFunc4(int a, {int b = 2}) | int someFunc4(int a, {int b = 2}) | ||
====無名関数(ラムダ、[[クロージャ]])==== | ====無名関数(ラムダ、[[クロージャ]])==== | ||
+ | ---- | ||
+ | [[Category:ラムダ]] | ||
+ | |||
list.forEach((item) => print(item)); | list.forEach((item) => print(item)); | ||
+ | |||
====ブロック==== | ====ブロック==== | ||
+ | ---- | ||
*変数のスコープ分離 | *変数のスコープ分離 | ||
====[[クロージャ]]==== | ====[[クロージャ]]==== | ||
+ | ---- | ||
*変数のスコープから外れても利用できる | *変数のスコープから外れても利用できる | ||
====カスケード表記==== | ====カスケード表記==== | ||
+ | ---- | ||
*..でインスタンスの記述を省略できる | *..でインスタンスの記述を省略できる | ||
*メソッドを連続で呼び出すことができる | *メソッドを連続で呼び出すことができる | ||
+ | |||
===演算子=== | ===演算子=== | ||
+ | ---- | ||
====型演算子==== | ====型演算子==== | ||
+ | ---- | ||
*as | *as | ||
*is | *is | ||
*is! | *is! | ||
====条件付きメンバアクセス==== | ====条件付きメンバアクセス==== | ||
+ | ---- | ||
*?. | *?. | ||
+ | ===アクセッサ=== | ||
+ | ---- | ||
+ | *http://dart-ing.blogspot.com/2012/03/dartgetset.html | ||
+ | *クラスのメンバーにgetとset(いわゆるゲッターとセッター)を定義することができます。ゲッターとセッターで定義されたメンバーは、あたかもメンバー変数と同じようにアクセスできますが、変数への代入だけではなく、ほかの処理を追加することもできます。 | ||
+ | <pre> | ||
+ | class Line { | ||
+ | Line(this.start, this.end); | ||
+ | int start, end; | ||
+ | int get length() => end - start; | ||
+ | void set length(int len) { | ||
+ | end = start + len; | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
===構文=== | ===構文=== | ||
+ | ---- | ||
====try catch==== | ====try catch==== | ||
+ | ---- | ||
*例外チェックは行わない | *例外チェックは行わない | ||
try { | try { | ||
146行目: | 299行目: | ||
// sはスタックトレース | // sはスタックトレース | ||
} finally{} | } finally{} | ||
+ | |||
+ | ==null安全== | ||
+ | *https://medium.com/flutterworld/flutter-null-safety-5d20012c2441 | ||
+ | *https://gaprot.jp/2021/04/27/flutter-sound-null-safety/ | ||
+ | *[https://dart.dev/codelabs/null-safety#map-types null安全コードラボ] | ||
+ | |||
+ | *ver2.1.2 から型レベルでnull安全を導入 | ||
+ | <pre> | ||
+ | final String country = null; // nullを代入できない | ||
+ | final String? country = null; // nullを代入できる | ||
+ | </pre> | ||
+ | |||
+ | ===Non Nullable Type=== | ||
+ | ---- | ||
+ | *変数に ! を付けることで、その変数が NULL ではないことをコンパイラに伝え、安全に使用できる | ||
+ | <pre> | ||
+ | void main() { | ||
+ | String? country = "USA"; | ||
+ | String myCountry = country!; // myCountry は null不許可 country が null の場合はエラーとなる | ||
+ | } | ||
+ | </pre> | ||
+ | ===lateの使用=== | ||
+ | ---- | ||
+ | *lateキーワード は後で初期化される変数を示すために使用できる。 | ||
+ | *宣言時ではなく、アクセス時に初期化される。 | ||
+ | *初期化される前の値にアクセスすると、ランタイムエラーが発生 | ||
+ | <pre> | ||
+ | void main() { | ||
+ | late String country; // null不許可 | ||
+ | // ここで、print(value) した場合、ランタイムエラー | ||
+ | country = "USA"; | ||
+ | } | ||
+ | </pre> | ||
==ジェネリクス== | ==ジェネリクス== | ||
151行目: | 337行目: | ||
==オブジェクト指向== | ==オブジェクト指向== | ||
+ | ---- | ||
*https://dart.dev/guides/language/language-tour#classes | *https://dart.dev/guides/language/language-tour#classes | ||
*[[Dart]]はクラスとミックスインベースのインターフェースによるオブジェクト指向言語。 | *[[Dart]]はクラスとミックスインベースのインターフェースによるオブジェクト指向言語。 | ||
156行目: | 343行目: | ||
====キーワード==== | ====キーワード==== | ||
+ | ---- | ||
*継承 extends | *継承 extends | ||
*継承元呼び出し super | *継承元呼び出し super | ||
161行目: | 349行目: | ||
===クラス=== | ===クラス=== | ||
+ | ---- | ||
==非同期処理== | ==非同期処理== | ||
*asyncパッケージをインポート | *asyncパッケージをインポート | ||
import 'dart:async'; | import 'dart:async'; | ||
+ | ==拡張メソッド(Extension method)== | ||
+ | *[https://qiita.com/akiakishitai/items/e2fc2e5ae8b7f6abcde4 拡張メソッド] | ||
==[[言語]]サンプル== | ==[[言語]]サンプル== | ||
*https://dart.dev/samples | *https://dart.dev/samples | ||
===File=== | ===File=== | ||
+ | ---- | ||
*https://api.dart.dev/stable/2.5.0/dart-io/File-class.html | *https://api.dart.dev/stable/2.5.0/dart-io/File-class.html | ||
+ | |||
+ | ==Tips== | ||
+ | ===実行時の型を調べる=== | ||
+ | ---- | ||
+ | runtimeType | ||
+ | print(o.runtimeType); | ||
+ | |||
+ | ===ログ=== | ||
+ | ---- | ||
+ | *https://stackoverflow.com/questions/42440061/how-to-fully-dump-print-variable-to-console-in-the-dart-language | ||
+ | <pre> | ||
+ | import 'dart:developer'; | ||
+ | inspect(myVar); | ||
+ | </pre> | ||
+ | |||
+ | <pre> | ||
+ | import 'dart:convert'; | ||
+ | print(json.encode(yourMapVariable)); | ||
+ | </pre> | ||
+ | |||
+ | [[category:プログラミング言語]] |
2022年2月16日 (水) 09:20時点における最新版
目次
Dart
|Flutter | ブログカテゴリ(Flutter) | Android Studio | Flutter macos | FlutterFire | Flutter 手順 |
言語仕様
Effective Dart
基本
Install
Windows
Mac
- https://dart.dev/get-dart
- install
- $ brew tap dart-lang/dart
- $ brew install dart
- update
- $ brew upgrade dart
DartPad
APIリファレンス
パッケージ
- Dart標準は、dart:
- import 'dart:html';
- ローカルは相対パス(dart:省略)
- pubパッケージマネージャ
パッケージから特定のオブジェクトのみimportする
- import [package] show [objects]
- import 'package:google_sign_in/google_sign_in.dart'
- show GoogleSignIn, GoogleSignInAccount;
Hello
- hello.dart
- void main() {
- print("Hello Dart!");
- }
- 実行
- >dart hello.dart
- Hello Dart!
型
数値
numのサブクラス
- int
- double
真偽
- bool
文字列
String
補完
- ${}
- print("Hello ${this.name}.");
リテラル
- 一重、二重引用符
- 引用符3�つ重ねで複数行
StringBuffer
Runes
- UTF-32型の文字
- 絵文字などの表現
コレクション
List
- []
- add
- insert
- removeAt
- indexOf
- sort
- shuffle
- forEach
- every
- map
- reduce
連結
- void main() {
- var l = [1,2,3];
- print(l);
- [...l, 4, 5, 6];
- print(l);
- l = [...l, 4, 5, 6];
- print(l);
- }
- 結果
- [1, 2, 3]
- [1, 2, 3]
- [1, 2, 3, 4, 5, 6]
Map
- {}
- remove
- addAll
- forEach
- containsKey
==
Symbol
- Dartの構文での演算子や識別子
Functions
- 関数は実行可能なアクションの抽象化
- 関数もオブジェクトでその型はFunction
- 関数は第1級関数(first-class function)であり、ある関数を別の関数にパラメターとして渡すことも可能
Enum
- 列挙
- enum Menu { google_sign_in, firestore_cloud_vision }
- 値を割り当てるだめの妥協
- class Status {
- static const int created = 10;
- static const int deleted = 90;
- }
文法
基本
- セミコロン必須
エントリーポイント
- void main() もしくは、void main(List<String> args)
コメント
単一行
- //
複数行
- /*...*/
ドキュメンテーション
- /**または///で始まる
- 角括弧を使ってクラス、メソッド、フィールド、トップ・レベル変数、及びパラメタを参照可能
- 角括弧内の名前はそのドキュメント化されたプログラム要素の構文スコープ内で解決
- ドキュメンテーション
- ドキュメンテーションツール
変数
var
- 型推論
- 初期値null
- 型宣言
late
- https://qiita.com/nukotsuka/items/66236723bf17c4574608
- 遅延初期化
- 宣言後に初期化されるnon-nullable変数の宣言
- lateで修飾した変数は、宣言時にthisにアクセス可能
定数
final
- 再代入不可
const
- コンパイル時点で評価
- オブジェクトの変更禁止
- final List<int> list1 = [1, 2, 3];
- list1.add(4); // [1, 2, 3, 4]
- List<int> list2 = const [1, 2, 3];
- list2.add(4); // エラーが発生
コンストラクタ
- class Book {
- String title;
- String author;
- Book();
- Book.fromMapWithTitle({Map<String, dynamic> map, String title}) {
- title = title;
- author = map["author"];
- }
- Book.fromMap(Map<String, dynamic> map) :
- this.fromMapWithTitle(map:map);
- }
関数
- 第1級オブジェクト
- 宣言
- 関数もオブジェクトでその型はFunction
- Dartの関数は第1級関数(first-class function)である。
- 関数を別の関数にパラメタとして渡すことも可能である.
- int someFunc2(int a, int b) {
- return a + b;
- }
1行 矢印構文(arrow syntax)
- => exprという構文は{ return expr; }の短縮形
式のみが矢印(=>)とセミコロン(;)の間に置かれる。例えば、if文はおけないが、条件式は使える。
- bool isHoge(String str) => str == "hoge";
引数の指定
- someFunc3(a: 1, b: 2, c: 3);
オプション引数
- String conc(String a, String b, [String c])
デフォルト引数
- int someFunc4(int a, {int b = 2})
無名関数(ラムダ、クロージャ)
- list.forEach((item) => print(item));
ブロック
- 変数のスコープ分離
クロージャ
- 変数のスコープから外れても利用できる
カスケード表記
- ..でインスタンスの記述を省略できる
- メソッドを連続で呼び出すことができる
演算子
型演算子
- as
- is
- is!
条件付きメンバアクセス
- ?.
アクセッサ
- http://dart-ing.blogspot.com/2012/03/dartgetset.html
- クラスのメンバーにgetとset(いわゆるゲッターとセッター)を定義することができます。ゲッターとセッターで定義されたメンバーは、あたかもメンバー変数と同じようにアクセスできますが、変数への代入だけではなく、ほかの処理を追加することもできます。
- class Line {
- Line(this.start, this.end);
- int start, end;
- int get length() => end - start;
- void set length(int len) {
- end = start + len;
- }
- }
構文
try catch
- 例外チェックは行わない
- try {
- } on Exception catch (e) {
- } catch (e, s) {
- // sはスタックトレース
- } finally{}
null安全
- https://medium.com/flutterworld/flutter-null-safety-5d20012c2441
- https://gaprot.jp/2021/04/27/flutter-sound-null-safety/
- null安全コードラボ
- ver2.1.2 から型レベルでnull安全を導入
- final String country = null; // nullを代入できない
- final String? country = null; // nullを代入できる
Non Nullable Type
- 変数に ! を付けることで、その変数が NULL ではないことをコンパイラに伝え、安全に使用できる
- void main() {
- String? country = "USA";
- String myCountry = country!; // myCountry は null不許可 country が null の場合はエラーとなる
- }
lateの使用
- lateキーワード は後で初期化される変数を示すために使用できる。
- 宣言時ではなく、アクセス時に初期化される。
- 初期化される前の値にアクセスすると、ランタイムエラーが発生
- void main() {
- late String country; // null不許可
- // ここで、print(value) した場合、ランタイムエラー
- country = "USA";
- }
ジェネリクス
- void hoge(List<T> list){}
オブジェクト指向
- https://dart.dev/guides/language/language-tour#classes
- Dartはクラスとミックスインベースのインターフェースによるオブジェクト指向言語。
- すべてのオブジェクトはクラスのインスタンスでObjectの子孫
キーワード
- 継承 extends
- 継承元呼び出し super
- オーバーライド @overrideアノテーション
クラス
非同期処理
- asyncパッケージをインポート
- import 'dart:async';
拡張メソッド(Extension method)
言語サンプル
File
Tips
実行時の型を調べる
runtimeType
- print(o.runtimeType);
ログ
- import 'dart:developer';
- inspect(myVar);
- import 'dart:convert';
- print(json.encode(yourMapVariable));
© 2006 矢木浩人