Open7

Dartメモ

WaterWoodWaterWood

【Dart】"///" の使い方

クラスやメソッドの前に "///" で始まるコメントを書くことでドキュメントが自動生成される

var _isLogin = true;
/// アカウントがある場合はログイン
/// 無い場合は新規作成してログインする
void _submit(){
    if (_isLogin) {
    /*
    ログイン処理
    */
    } else {
    /*
    サインアップ処理。新規ユーザー登録
    */
    }
}
WaterWoodWaterWood

【Dart】Map.entriesの書き方

MapはそのままではIterableではないのでMap.entriesでIterableに変換する必要がある。

コード

Map<String, int> populations = {
    'Hokkaido': 522,
    'Aomori': 118,
}

for (var MapEntry(key: key, value: population) in populations.entries){
    print('$keyの人口は$population万人です。');
}

実行結果

北海道の人口は522万人です。
青森の人口は118万人です。

WaterWoodWaterWood

【Dart】const, final, varの使い分け

定義云々は置いといてもっとも多くに使われるのはfinal。まずは他の二つがどういう時に使うのかを例外的に覚えれるのがいいかも。
const > final > var の順で優先される。
コンパイル時に値が決まるならconst、アプリケーション実行時に値が決まるならfinal、実行後に値が変わるならvar。

var

再代入可能。
状況によって変化するtrue, falseの真偽値。
フォームの値を入れる変数など。
型指定できない。 // varだけの特徴

var isSending = false;
var enteredTitle = '';

void submitForm() {
    isSending = true; // フォーム送信中はtrueにする
    enteredTitle = newValue; // フォームに入力された値をその都度代入する
    /*
        バックエンドへのデータ送信処理など
    */
    isSending = false; // 送信が終わったのでfalseにする
}

const

コンパイル時に値が決定されるもの。
定数。enumなどなど。

const pi = 3.14; // 変化の仕様がない常に決まった値
final now = DateTime.now(); // プログラム実行時に値が決まる
WaterWoodWaterWood

typedef

関数を引数にする場合の可読性の向上のために使用した。

typedef UploadFunction = Future<void> Function({
  required String table,
  required String path,
  required File file,
  required BuildContext context,
  required SupabaseClient supabase,
});

公式のサンプルを見ると頻出するデータ構造なんかに名前を付けるのによく使われるのかな。

typedef IntList = List<int>;
IntList il = [1, 2, 3];

https://dart.dev/language/typedefs

WaterWoodWaterWood

FileとXFileのちがい

https://zenn.dev/kgsi/articles/cf1e7c52a3a3ca
https://api.dart.dev/stable/2.18.6/dart-io/dart-io-library.html
https://pub.dev/documentation/cross_file/latest/cross_file/
DartのioライブラリはBrowser-based appsには使えない。
なのでクロスプラットフォームで使えるXFileが使われる。
参考解説ページで書かれてるようにimage_pickerXFileが使われてなにやこれ?となった。
Flutterの発展に伴いそのカバー範囲が広がっていった結果、最初のioでは力不足となったのかな?
XFileがファイルの作成や書き込みができないのも、元々のFileでカバーできない処理を担うためっぽいね。

WaterWoodWaterWood

Mixin

Dartの解説動画なんてこの世界に存在しないので。
https://www.youtube.com/watch?v=YO6vNfRiGzM

ポイント

・クラスに機能を追加する
・継承ではないのでスーパークラスとサブクラスに「is-aの関係」はない
・インスタンス変数を作らずメソッドだけ
・サブクラスでオーバーライドはNG。それならミックスインする必要ない
・複数継承OK
https://dart.dev/language/mixins

WaterWoodWaterWood

?.call()の使い方

以下のコードで

「Use a null-aware invocation of the 'call' method rather than explicitly testing for 'null'.
Try using '?.call()' to invoke the function.」

とヒントが出た。
「'null' を明示的にテストするのではなく、'call' メソッドの null対応の呼び出しを使用してください。 関数を呼び出すために '?.call()' を使ってみてください。」

if (widget.onSelectedChanged != null) {
    widget.onSelectedChanged!(isSelected: isSelected);
}

次の一行でいいとのこと。

widget.onSelectedChanged?.call(isSelected: isSelected);