SKILL

Flutterで開発するためにDartを勉強する

Flutterで開発するためいDart言語を勉強したい。どうやって勉強すのがおすすめ?

このような疑問に答えていきます。

Dart言語はプログラミング言語なの中でもマイナーな言語Googleが作っている言語であるものの、2018年ごろまでは学ぶ価値のないプログラミング言語とまで言われていました。

しかし、Flutterというモバイルアプリ開発向けのツールが登場して一気に流れが変わりました。Flutterについては下記の記事でまとめたので知らない方は是非みてください。

【Flutter】 Google産のモバイル・ウェブ同時開発ツールについて調べる

 

Dart言語自体はあまり人気がなく情報も少ないですが、非常に便利なDart用のWebサイトがあるためそれを使って基本文法までさくっと理解したいと思います。

Dart言語の特徴

Dart言語はGoogle社製のプログラミング言語でDashという名前で開発されましたが、最終的にはDartという名前になったようです。

Dar言語はJavaのようなオブジェクト指向型の言語で、コードの書き方はjavascriptに近いイメージです。

他言語に比べて言語の仕様書が半分程度しかありません。一般的な言語にはあっても不要な機能はできる限り無くす思想で作られています。

そのおかげで人によって書き方に差が出にくいという特徴があります。

見方によっては機能不足という意見もあります。Flutterが出て注目される前はメリットという見方よりもデメリットという見方が強く結果として学ぶ価値のない言語のような誤った概念が広まってしまったのだと思います。

 

Dart言語の勉強方法

Dart言語はweb上で実行することができるサービスがあります。

下記サイトにアクセスしてDart言語の文法を試していきたいと思います。

 

非常に簡単に試すことができます。本来SDKや開発用のIDEをインストールして初めて試すことができますが、Dartについてはこのサイトで入力してすぐに実行して結果を得ることができます。

私個人の勉強方法は下記記事に載せています。もし学習の仕方が定まっていない方は是非参考にしてください。

現役エンジニアが教えるアプリケーションエンジニアになる方法

 

Dart言語の基本文法

型・変数の代入

Dartは全てオブジェクト型です。

他の言語ではプリミティブ型とオブジェクト型の2つの概念があります。例えばjavaの場合intとIntegerは数値を格納するということは同じですが、intはプリミティブ型なので初期化は0でnullを入れることはできません。しかしオブジェクト型のIntegerには初期化がnullでnull自体を取り扱うことができます。

void main() {
  //通常の数値を入れる
  int intTest1 = 3;
  print(intTest1);
  double doubleTest1 = 1.5;
  print(doubleTest1);
  
  //intだけどobject型なのでnullも入れられます。
  int intTest2 = null;
  print(intTest2);
  
  //通常の文字列を入れる
  String stringTest1 = 'あいうえお';
  print(stringTest1);
  
  //List型です。配列とリストは概念として区別されていません。
  List<String> stringListTest1= ['a', 'b', 'c'];
  print(stringListTest1);
  List<int> intListTest1 = [1,2,3,4];
  print(intListTest1);
  //この入れ方ができるのは不思議
  List nonListTest1 = [1,2,3,'1'];
  print(nonListTest1);
  print(nonListTest1[0]+nonListTest1[1]);
  //これはエラーになる
  //intとStringの足し算はできない
  //print(nonListTest1[0]+nonListTest1[3]);
  
  //連想配列
  Map mapTest1 = {'key1':'test1','key2':'test2'};
  print(mapTest1);
  print(mapTest1['key1']);
}

【結果】

3
1.5
null
AIUEO
[a, b, c]
[1, 2, 3, 4]
[1, 2, 3, 1]
3
{key1: test1, key2: test2}
test1

List型の取り扱いに少し注意が必要な印象です。通常型に指定した型1つしか入らない概念ですがDartの場合Stringやintも同時に入れられるようです。

varを使った型推論にも対応しているようです。


void main() {
 var test1 = 1;
 print(test1);

 var test2 = 'test2';
 print(test2);

 var test3 = [1,2,3,4,5];
 var test4 = ['aaa','bbb','ccc','ddd','eee'];
 print(test3);
 print(test4);

 //連想配列はvarで指定できない
 //var test5 = ['key2':'2'];
 //print(test5);
}

【結果】


1
test2
[1, 2, 3, 4, 5]
[aaa, bbb, ccc, ddd, eee]

 

若干不思議な仕様もありますが、今まで多言語を習得した経験者ならそこまで苦労しません。

むしろ思ったり制約がなくて適当でも動く印象です。(理解せずに使ってバグ作り込みそうなのでテストは必須ですね)

 

分岐(if文)

void main() {
  var ifTest = true;
  
  if (ifTest) {
      print('trueならこっち');
  }
  
  if (!ifTest) {
      print('falseならこっち');
  }
  
  ifTest = false;
  
  if (ifTest) {
      print('trueならこっち');
  }
  
  if (!ifTest) {
      print('falseならこっち');
  }

 

良くあるif文の書き方で使えます。

繰り返し(for文)

void main() {
  for (int i=0;i<3;i++) {
    print(i.toString()+'回目');
  }
  
  print('--------------------');
  
  //型推論でも行けます。
  for (var i=0;i<3;i++) {
    print(i.toString()+'回目');
  }
  
  print('--------------------');
  
  List<int> testList = [1,2,3];
  for (int i in testList) {
    print(i.toString()+'回目');
  }
  
  print('--------------------');
  
  testList.forEach((int test){
    print(test.toString()+'回目');
  });
}

【結果】

0回目
1回目
2回目
--------------------
0回目
1回目
2回目
--------------------
1回目
2回目
3回目
--------------------
1回目
2回目
3回目

こちらも通常の書き方ができます。
複数言語を習得済みなら問題ないですが、for文の書き方がpythonに近いです。
List型を繰り返す際は「:」ではなく「in」です。

関数

void main() {

 testFunction('あいうえお');

 testFunction2(1,2);

}

testFunction(String message){
 print(message);
}

testFunction2(int i,int y){
 print(i+y);
}

【結果】

あいうえお
3

関数の頭にスコープはつけられません。もしスコープの制御をしたいなら変数に対して「_」などを付与する必要があります。

 

クラス


class TestClass{
 testFunction(int x,int y){
  print(x+y);
 }
}

class TestClass2{
 int x;
 int y;
 String testString;
 TestClass2(int x,int y,String abc){
  this.x = x;
  this.y = y;
  //フィールド変数と引数が同じ時はthisをつけるが違う場合は省略すること
  testString = abc;
}
 getTestClass2(){
   return ((x+y).toString()+testString);
 }
}

void main() {

 TestClass testClass = new TestClass();
 testClass.testFunction(1,2);

 //コンストラクタの初期化を利用
 TestClass2 testClass2 = new TestClass2(3,4,'テスト');
 print(testClass2.getTestClass2());
}

【結果】

3
7テスト

classも通常の扱い通りです。ただし、クラスのフィールド変数への代入のときはthisを省略するのがDartのルールです。
thisをつけるのは引数の名前と同じ場合のみです。

 

同期・非同期


void main() {
 start();
 load();
 end();
}

start(){
 print('start');
}

loadTask(String number) {
 print(number);
}
load() async {
 loadTask('1');
 loadTask('2');
 loadTask('3');
}

end() {
 print('end');
}

【結果】

start
1
2
3
end

何故でしょうか。同期的な動きになります。
本来これで123の前にendが入るような動きになるはずなのですが、DartPadでは再現できませんでした。

 

Dart言語の所感

Dart言語を使ってみてjavascriptのように経験のあるエンジニアなら感覚的に書いても動く印象でした。

また、Javaに近い言語なのでJavaエンジニアならすぐに使い慣れそうです。

これで簡単な文法は使えるようになったので、次はFlutterで開発していきたいと思います。

-SKILL
-, , ,

© 2021 Engineer Life Blog