Dartをゼロから理解する

# これは？
Flutterで使うDartをゼロから理解できるための資料です

# クラス
Dartはオブジェクト指向の言語です。
クラスを作成しクラスから生成したオブジェクトを使用して処理を行います。
クラスとオブジェクトの関係は、鯛焼き型と鯛焼きで例えるとわかりやすいか思います。

### クラス = たいやき型
プログラミングは仕組み化をつくる作業なので、鯛焼きを作成する仕組みである鯛焼き型に相当します。鯛焼き型に羽付き鯛焼きを作る仕組みや、名古屋のシャチホコのような変わった形などさまざまな機能を実装していきます。

### インスタンス = たいやき
クラスから生成したインスタンスは、鯛焼きに相当します。鯛焼き型で実装された機能に加えて、鯛焼きのあんこの種類のような、インスタンスごとの振る舞いの違いを持つことができます。

### オブジェクト指向のメリット
プログラムはデータを加工するための仕組みです、クラスを使うと１つの仕組みに対して、こしあん、つぶあんのように、複数のデータを効率的に当てはめることができます。

<img width="656" alt="スクリーンショット 2019-12-09 10.28.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32586/db54fe31-2245-9648-9a2d-b4c956bb80f2.png">

# Flutterに当てはめると
FlutterにはWidgetと呼ばれる様々な見た目を作成するクラスが用意されています。例えば`Text`を使うと、画面に文字列を表示することができます。Textクラスに渡す文字列を変更することで、同じTextクラスを使って画面に表示する文字列を出し分けることができます。

```
Text('こしあん')
```
<img width="418" alt="スクリーンショット 2019-12-09 10.49.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32586/c3bb6d42-530f-d773-bf93-2dfa90d7571f.png">
```
Text('つぶあん')
```
<img width="413" alt="スクリーンショット 2019-12-09 10.50.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32586/c310e56f-e0c1-02d7-4df7-143acddf46df.png">

## クラスの構造
情報量が多いですが、下記がクラスの構成になります

<img width="532" alt="sample_dart_—_sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32586/520e0c68-636a-1db8-4875-a94bd6c38365.png">

## クラスの初め方
クラスは先頭に`class`というキーワードで初め続けて、クラス名を書き、`{}`で囲みます。ミニマムなクラスは下記のとおりです

```dart
class SampleClass {

}
```

## 継承
クラスは別のクラスの機能を継承して含めることができます。他のクラスを継承するには、`extends`に続けて、継承元のクラス名を書きます|

```dart
class SampleClass extends StatelessWidget {

}
```
## 変数
クラスはインスタンス変数を持ちます。たいやきのたとえ話で言うと、あんこに該当します。インスタンス変数は何度でも自由に変更できる(mutable=可変)な変数と、先頭にfinalをつけ一度代入したら変更不可能(immutable=不変)な変数の２種類存在します。

### mutableな変数
変数の型に続けて、変数名を書きます。

``` dart
String name
```

### immutableな変数
`final`キーワード、変数の型に続けて、変数名を書きます。

``` dart
final String name
```
### 型
変数には格納可能な値の種類に応じて、基本型が用意されています。基本型以外に自分で作成したクラスを型
として使い、インスタンスを格納することもできます

|キーワード|説明|
|-----------------|-----------------|
|String| 文字列を格納できます|
|int|数値を格納できます|
|double|小数を格納できます|


### コンストラクタ
クラスからインスタンスが生成されるときに、1度だけ呼び出される特別なメソッドです。クラス名と同じ名前にします。
インスタンスの初期化処理を行いますが、dartでは少し特殊なので詳しく書きます

### 引数
`this.name`のように`this`をつけた変数は、自動的にインスタンス変数に値が格納されます。

```dart
SampleClass('taiyaki')
```
のように呼び出すとインスタンス変数`name`に自動的に値が格納されます。
<img width="575" alt="sample_dart_—_sample2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32586/110fd1ab-08e7-3aee-71a3-5b1470576a2b.png">

### 名前付き引数
コンストラクターで、`{this.age}`のように`{}`で囲んで定義すると、名前付き引数になります。名前付き引数は、呼び出すときに、名前付きで呼び出します

``` dart
SampleClass(age: 10);
```
<img width="575" alt="sample_dart_—_sample3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32586/cbb26786-05c2-5ba9-6227-73861ffbcb25.png">

### メソッド
クラスには実際の処理を書くことができます。メソッドは

```
戻り値の型 メソッド名(引数){
  //ここに処理を書く
}
```
のように記述します。

``` dart
Widget build(BuildContext context) {
 return Text(name);
}
```
また単純に値をreutrnするだけの場合、シンタックスシュガー`=>`を使って以下のように記述できます

``` dart
Widget build(BuildContext context)=> Text(name);

```
## クラスメソッド
先頭に`static`をつけたメソッドは、クラスメソッドとなり、インスタンスを生成しない状態で呼び出すことができます。たいやきのたとえ話でいうと、たいやき型側の機能に該当します。例えば、こしあん入のたいやきをつくるクラスメソッドを作ると以下のようになります。

定義情報

``` dart
class Taiyaki extends StatelessWidget {
  static Widget withKoshian() => Taiyaki('koshian');
}
```

呼び出し側

``` dart
Taiyaki.withKoshian()
```

このようにこしあん入りのたいやきインスタンスを生成することができます。


# 制御構文
## 分岐
条件によって処理を分けた場合は、`if`を使います

``` 
if (条件) {
  条件が真の場合の処理
} else {
   条件が偽の場合の処理
}
```
例

``` dart
if (mode == 2) {
  return Text('こしあん')
} else {
  return Text('つぶあん')
}
```

## ループ
値の集合である配列に対して処理を行う場合は、高階関数を使います。高階関数とは、関数を引数として受け取る
メソッドのことです

### map
元の配列のそれぞれの値を、別の値に変換します。この例では、こしあん、つぶあんという、文字列の配列を、Textウィジェットに変換してます。なお、変換後の戻り値は`Iterable<T>`であるため、`toList()`で配列に戻す必要があります。

``` dart
['こしあん', 'つぶあん'].map((anko) => Text(anko)).toList()
```

``` dart
(anko) => Text(anko)
```
この部分が関数であり、引数ankoをとり、Widgetを返却しています。シンタックスシュガーを使わずに書くと

``` dart
(anko) {return Text(anko)}
```
となり、

```
(引数) { 処理 }
```
が記述方法です

### forEach
元の配列のそれぞれの値に対して何かの処理を行います。

``` dart
['こしあん', 'つぶあん'].forEach((anko) => save(anko))
```
この例では保存処理`Save`メソッドを呼び出しています。