🍛

Flutter学習街道 Dartの基礎編

2023/04/16に公開

概要

Flutterを最近学んでいるので、dartの基礎構文をメモります。これは第一弾です。疲れるので、小分けにメモります。気が向いたら書き足します。

Dartの型について学ぶの巻

整数型: int

最小値:-9,223,372,036,854,775,808 〜
最大値:9,223,372,036,854,775,807

int num = 100;

浮動小数点数型: double

double decimal = 3.14;

文字列型: String

String name = 'dart';

リスト型: List<>

List<int> numbers = [0, 1, 2, 3];

集合型: Set<>

Set<String> names = {'Takashi', 'Yuto'};

マップ型: Map

Map<String, int> age = {'Yuto': 25, 'Kuno': 25};

なんでもあり型: dynamic

dynamic any = 'Hoge~~';
List<dynamic> anyList = ['Hogerin', 3, {'name': 'Kuno'}];

関数型: Function

Function(int, int) add = (int a, int b) => a + b;
add(3, 5);//8

Null(Dart 2.12以降)

int? nullableNum = null;
if (nullableNum != null) {
  //nullでない場合の処理
}

型推論: var

var num = 1;//型推論でint型

varを使用した場合、コンパイラが推測した型に基づいて変数が静的に型付けされるため、後から別の型の値を代入しようとすると、エラーが発生する。
また、double型からint型などへの暗黙的な型変換も自動ではされない。

var value = 42; //int型
value = 'Hello'; //❌エラー String型はint型に代入できない。
value = 10.0; //❌エラー 暗黙的な型変換がされない。

Dartの定数について学ぶの巻

finalとconstの違い

final: 変数が初めて参照される時に値が決定し、その後、再代入をすることができない。
現在の日時を代入したり

final now = DateTime.now();

APIから取得したデータを代入したり

final data = fetchUsers();

といった実行時に値が決まるものに使用できる。
また、再代入はできないが、値の変更は可能である。

final List<int> list = [1, 2, 3];
list = [4, 5, 6]; //❌エラー
list[0] = 5; //⭕️OK

const: コンパイル時に値が決定し、再代入、値の変更がすることができない。
以下はエラーになる。

const now = DateTime.now(); //❌ コンパイル時に日時が決まらないためエラー
const List<int> list = [0, 1, 2];
list[0] = 5; //❌ 値を変更することができない

コンパイル時に決定した値を使用して、constを定義することは可能

const a = 9;
const b = a + 1; //⭕️OK

dartの不可視識別子について学ぶの巻

dartにはpublicprotected,privateなどの修飾子がない。
その代わり不可視識別子という、変数、関数などの名前の先頭に(_)をつけることでライブラリ(ファイル)レベルでprivateにすることができ、外部からのアクセスを防ぐことができる。

person.dart
class Person {
  String _name;
  int _age;
  
  //コンストラクタ
  Person(this._name, this._age);
  
  //private
  void _callName() {
    print(_name);
  }
  
  //public
  void callAge() {
    print(_age);
  }
}

//ライブラリないでは_でもアクセスできる
void main() {
  var person = Person("KUNO", 25);
  person._callName();//アクセスできる
  person.callAge();//アクセスできる
}

別ライブラリ(ファイル)

Another.dart
import 'person.dart';

void main() {
  Person person = Person('ホゲータ', 66);
  person._callName();//アクセスできない
  person.callAge();//アクセスできる
}

dartの関数について学ぶの巻

dartの関数はオーバーロードが許されず、全て違う名前で定義する必要がある。

基本形

返却型 関数名(引数型 引数){}

上記が基本形だが、返却型は省略可能である。

int add(int num1, int num2) {
  return num1 + num2;
}

アロー関数

単一式の関数を=>を使って一文で記述することができる。

int add (int a, int b) => a + b;

無名関数

void main() {
  List<int> numbers = [0, 1, 2, 3, 4, 5];
  // アロー構文を使用した無名関数
  numbers.map((int num) => print(num * 2));
}

名前付き引数

{}を使って名前付きの引数を渡すことができる。

//名前付き引数をとる関数
int add({int num1, int num2}) => num1 + num2; 

void main() {
  //名前付きで引数を渡す
  int result = add(num1 = 1, num2 = 5);
  print(result);
}

dartの非同期処理を学ぶの巻

Dartは、非同期処理を実現するために、Futureasync/awaitなどの機能を提供している。
Futureクラスは、非同期処理の結果を表す
主なメソッドに、以下がある。
then(): Futureが成功した結果を受け取る。
catchError(): Futureがエラーを返した場合、エラーを受け取る。
whenComplete(): Futureが完了したとき(成功またはエラーの場合)に実行される処理を追加できる。

Future<int> fetchFutureInt() {
  //2秒後にFuture<int>を返す
  return Future.delayed(Duration(seconds: 2), () {
    return 2;
  });
}

void main() {
  fetchFutureInt()
    .then((num) => print(num))
    .catchError((error) => print('エラー: $error'))
    .whenComplete(() => print('操作が完了しました'));
}

async/await

関数の前にasyncキーワードを追加することで、その関数内でawaitキーワードを使用できる。
awaitキーワードは、Futureが完了するまで処理を一時停止し、結果を取得できる。

Future<String> fetchFutureMyName() async {
  //APIからデータを取得
  return await fetchMyName();
}

void main() async {
  final String name = await fetchFutureMyName();
}

dartの条件分岐について学ぶの巻

if-else

if () {

} else if () {

} else if () {

} else {

}

switch-case

enum TrafficLight { red, yellow, green }
TrafficLight currentLight = TrafficLight.red;
switch (currentLight) {
  case TrafficLight.red:
    print("赤じゃんね");
    break;
  case TrafficLight.yellow:
    print("黄色じゃんね");
    break;
  case TrafficLight.green:
    print("青じゃんね");
    break;
  default:
    print("無効な信号");
}

三項演算子

int num = 100;
String result = num >= 100 ? '100以上' : '100以下';

Discussion